UnityUnityメモ

Unityでエレベーターのように上昇する床を作る方法!【初心者向け】

Unity

1. はじめに

Unityを使ってゲームを作るとき、キャラクターが乗ると動く床やエレベーターのような仕組みを作りたいと思ったことはありませんか?このような動きは、ゲームの仕掛けとしてプレイヤーに楽しさや驚きを提供するだけでなく、ステージデザインを豊かにするためにも役立ちます。

例えば、アクションゲームやパズルゲームで、キャラクターを特定の場所に導く仕掛けとして利用したり、難易度を調整するためのギミックとして活用することができます。

この記事では、初心者でも簡単に作れる「上昇する床」の作り方をステップバイステップで解説します。スクリプトを使って床を動かし、プレイヤーとの連動を実現する方法を、わかりやすい手順で説明していきます。Unityの基本操作を学びつつ、実践的なスキルも身につけられる内容ですので、ぜひ挑戦してみてください!

Unityを触ったことがないという方はコチラの記事から見てみてください!



2. 必要な準備

Unityで上昇する床を作るためには、まずUnityプロジェクトを準備し、シーンを整える必要があります。ここでは、初めてUnityを触る方でもわかりやすいように、基本的な準備手順を解説します。

2-1. Unityプロジェクトの作成

  1. Unity Hubを開く
    Unity Hubを起動して、右上の「New Project」ボタンをクリックします。
  2. テンプレートを選ぶ
    「3D」テンプレートを選び、プロジェクト名を入力します(例:MoveableFloorProject)。保存先フォルダを指定して、「Create Project」をクリックします。
  3. プロジェクトの準備が完了
    プロジェクトが作成され、Unityエディターが開きます。この中でゲームの制作を進めます。

2-2. シーンの初期設定

シーンを作る前に、使いやすくするための基本設定を行いましょう。

  1. シーンの保存
    デフォルトで開かれている「SampleScene」を保存します。
    FileSave As をクリックし、適当な名前(例:MainScene)で保存してください。
  2. シーンビューの確認
    上部のタブから「Scene」ビューが選ばれていることを確認します。ここで3D空間を操作できます。
  3. ライトとカメラの確認
    初期状態で配置されている「Main Camera」と「Directional Light」があることを確認してください。これらはそのまま使用します。

2-3. プロジェクトの整理

開発をスムーズに進めるために、プロジェクト内のフォルダを整理しましょう。

  1. フォルダの作成
    Projectウィンドウで右クリックし、「Create」→「Folder」を選択します。以下のようにフォルダを作成してください。
    • Scripts(スクリプト用)
    • Materials(マテリアル用)
  2. 整理のポイント
    作成したスクリプトやマテリアルを適切なフォルダに入れることで、後から見つけやすくなります。

これで準備が整いました!次のステップでは、実際にオブジェクトを配置して上昇する床の作成を始めましょう。



3. 基本のオブジェクト配置

ここでは、ゲームの基礎となる床とプレイヤーをシーンに配置して設定していきます。具体的な手順をわかりやすく解説するので、一緒に進めてみましょう!


3-1. 床(Cube)の配置と設定

  1. 床の作成
    まずはプレイヤーが立つ床を作ります。
    • Hierarchyウィンドウを右クリックし、「3D Object」→「Cube」を選択します。
    • 新しく作成されたCubeを床として使用します。
  2. 床の位置とサイズを調整
    次にInspectorウィンドウでCubeの位置とサイズを設定します。以下の数値を入力してください。
    • Position: X=1, Y=0, Z=0
    • Scale: X=3, Y=0.2, Z=3
    これでプレイヤーが最初に立つ安定した床が完成です。

3-2. プレイヤー(Sphere)の配置と設定

  1. プレイヤーの作成
    次にプレイヤーを表すSphereを作成します。
    • Hierarchyウィンドウを右クリックし、「3D Object」→「Sphere」を選択します。
    • 作成したSphereを床の上に移動させます。
  2. 位置とサイズを調整
    InspectorウィンドウでSphereの位置を次のように設定してください。
    • Position: X=1, Y=0.6, Z=0
    • サイズ(Scale)はデフォルトのままでOKです。
  3. Rigidbodyの追加
    プレイヤーが物理的に動けるように、Rigidbodyコンポーネントを追加します。
    • Inspectorウィンドウで「Add Component」ボタンをクリックします。
    • 検索バーに「Rigidbody」と入力し、選択して追加します。
  4. 色を変更(任意)
    見やすくするためにSphereの色を変更してみましょう。
    • Projectウィンドウで右クリックし、「Create」→「Material」を選択します。
    • 作成したMaterialをSphereにドラッグ&ドロップし、Inspectorから好きな色を設定します。

これで床とプレイヤーの基本的な配置が完了しました!次のステップでは、床が上昇する仕組みを作っていきます。続けていきましょう!



4. 上昇する床の作成

このステップでは、エレベーターのように動く上昇する床を作成します。具体的には、床となるオブジェクトを追加し、C#スクリプトを使って動きをプログラムします。

1. 上昇する床(UpFloor)の配置

  1. Hierarchyウィンドウを右クリックして「3D Object」→「Cube」を選びます。
  2. 新しい床の名前を「UpFloor」に変更しましょう。
  3. Inspectorウィンドウで以下のように位置とサイズを調整します:
    • Position: (2, 0, 0)
    • Scale: (3, 0.2, 3)
  4. わかりやすいように床の色を変更します:
    • Inspectorウィンドウで「Material」を適用し、好きな色を設定してください。

2. スクリプトの作成

次に、この床を動かすためのスクリプトを作成します。

  1. プロジェクトウィンドウを右クリックして、「Create」→「C# Script」を選択します。
  2. スクリプトの名前を「MoveUp」とします。
  3. 作成したスクリプトを「UpFloor」にドラッグ&ドロップしてアタッチします。

3. スクリプトの内容

スクリプトをダブルクリックして開き、以下のコードを入力してください:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveUp : MonoBehaviour
{
    private Vector3 pos;

    // 床を動かし始める関数
    public void MoveStart()
    {
        StartCoroutine("FloorMove");
    }

    // 床を上昇させるコルーチン
    IEnumerator FloorMove()
    {
        while (pos.y < 3.0f)  // 床が高さ3に到達するまで動く
        {
            pos = transform.position;  // 現在の位置を取得
            transform.Translate(0, 0.02f, 0);  // 床を上に移動
            yield return new WaitForSeconds(0.01f);  // 少し待ってから次のフレームへ
        }
    }
}

このスクリプトでは、MoveStart関数が呼び出されると床が上昇を開始し、高さ3.0fまで動きます。StartCoroutineを使うことで、なめらかな動きを実現しています。

これで、上昇する床の基本部分が完成しました!次はプレイヤーが床を動かす仕組みを作っていきましょう。



5. プレイヤーの動作設定

このステップでは、プレイヤー(Sphere)が移動できるように設定し、上昇する床と連動して動く仕組みを作ります。具体的には、「SphereMove」というスクリプトを作成し、キャラクターの移動操作や当たり判定による床の動作を実装します。


スクリプト「SphereMove」の作成

  1. プロジェクトウィンドウでスクリプトを作成
    プロジェクトウィンドウを右クリックし、「Create」→「C# Script」を選択します。名前を SphereMove と付けましょう。
  2. 作成したスクリプトをプレイヤーにアタッチ
    「Sphere」を選択し、Inspectorウィンドウに「SphereMove」スクリプトをドラッグ&ドロップしてアタッチします。
  3. スクリプトを編集
    「SphereMove」をダブルクリックしてスクリプトを開き、以下のコードを入力します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SphereMove : MonoBehaviour
{
    public GameObject upFloor; // 上昇する床をリンクするための変数

    void Update()
    {
        // プレイヤーの移動操作
        float dx = Input.GetAxis("Horizontal") * Time.deltaTime * 3.0f;
        float dz = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f;

        // 新しい位置を設定
        transform.position = new Vector3(
            transform.position.x + dx, transform.position.y, transform.position.z + dz
        );
    }

    private void OnTriggerEnter(Collider other)
    {
        // 当たり判定:エリアに入ったら床が上昇開始
        if (other.gameObject.name == "Area")
        {
            upFloor.GetComponent<MoveUp>().MoveStart();
        }
    }
}

スクリプトのポイント解説

  • public GameObject upFloor;
    上昇する床(UpFloorオブジェクト)をスクリプトで操作するための変数です。この変数に実際のオブジェクトをInspectorウィンドウでドラッグ&ドロップしてリンクします。
  • プレイヤーの移動
    Input.GetAxis を使って、キーボード(WASDや矢印キー)の入力に応じてプレイヤーを移動させます。移動速度は Time.deltaTime を掛けて調整しています。
  • 当たり判定
    OnTriggerEnter メソッドで、プレイヤーが「Area」と名前の付いたオブジェクトに触れると、上昇する床のスクリプト MoveStart() を呼び出して動作を開始します。

スクリプトをリンクする

  1. 「Sphere」を選択し、Inspectorウィンドウの「SphereMove」スクリプトを確認します。
  2. Up Floor フィールドに「UpFloor」オブジェクトをドラッグ&ドロップ してリンクします。

これで、プレイヤーが当たり判定エリアに入ったときに、床が上昇するようになります!


次のステップでは、トリガーエリアの作成と設定について説明します。問題がある場合や詳しく知りたい点があればお知らせください!



6. 当たり判定エリアの設定

上昇する床がプレイヤーの動きに反応して動き出すためには、当たり判定エリア(トリガーエリア)を設定する必要があります。このセクションでは、その設定手順をわかりやすく説明します。


6.1 トリガーエリアの作成

  1. Cubeの配置
    Hierarchyウィンドウを右クリックし、「3D Object」→「Cube」を選択します。
    作成したCubeは後ほど透明にするので、仮の位置に配置しておいて問題ありません。
  2. 名前を変更
    作成したCubeを選択し、名前を「Area」に変更します。これでエリアを管理しやすくなります。
  3. サイズと位置の調整
    Inspectorウィンドウで以下のようにサイズと位置を設定してください:
    • Position: (2, 1, 0)
    • Scale: (3, 1, 3)
      これでエリアが上昇する床の上に適切に配置されます。

6.2 トリガー設定

  1. Box Colliderの設定
    「Area」を選択した状態でInspectorウィンドウを確認し、「Box Collider」のコンポーネントを探します。
    • isTrigger にチェックを入れます。
      これにより、物理的な衝突ではなく、接触イベントを検知できるようになります。

6.3 エリアの透明化

  1. Materialの作成
    • Projectウィンドウを右クリックして「Create」→「Material」を選択します。
    • 作成したMaterialに「TransparentArea」と名前を付けます。
  2. Materialの設定
    作成したMaterialを選択し、Inspectorウィンドウで以下の設定を行います:
    • Rendering Mode: 「Fade」を選択
    • Albedo: 「A」の値(透明度)を 0 に設定
      これで、エリアが完全に透明になります。
  3. Materialを適用
    「TransparentArea」Materialを「Area」にドラッグ&ドロップして適用します。
    これで、見た目には何もないように見えるトリガーエリアが完成します。

これでトリガーエリアの設定は完了です!次はテストプレイで、プレイヤーが「Area」に触れたときに床がスムーズに上昇することを確認してみましょう。



7. テストプレイと調整

いよいよ作成した機能を動かしてみるときがきました!ここでは、テストプレイを実行して、正しく動作しているか確認する手順と、問題が発生した場合の調整方法を解説します。

テストプレイの手順

  1. ゲームの再生ボタンをクリック
    Unityエディター上部にある再生ボタン(▶)をクリックして、ゲームを開始します。
  2. プレイヤー(Sphere)を移動させる
    キーボードの矢印キーまたはW, A, S, Dキーを使用して、プレイヤーを動かします。作成した床やトリガーエリアへ移動してください。
  3. トリガーエリアに入る
    プレイヤーを操作して、「Area」と名前を付けた透明なトリガーエリアに移動します。この時点で、上昇する床(UpFloor)がゆっくりと上に動き始めるはずです。

動作確認のポイント

  • 床が正しく上昇するか?
    床がスムーズに3.0の高さまで上昇し、停止するかを確認します。
  • プレイヤーの操作性
    プレイヤー(Sphere)が意図した通りに動くかをチェックしてください。
  • トリガーエリアの反応
    トリガーエリアに入った瞬間に床が動き始めるかを確認します。

トラブルシューティング

テストプレイ中に問題が発生した場合は、以下のポイントを確認してください。

  1. スクリプトがアタッチされているか確認
    • 「MoveUp」スクリプトが「UpFloor」にアタッチされているかを確認します。
    • 「SphereMove」スクリプトがプレイヤー(Sphere)にアタッチされているかも確認してください。
  2. トリガーエリアの設定をチェック
    • 「Area」のBoxColliderで「Is Trigger」にチェックが入っていることを確認します。
    • トリガーエリアのサイズや位置が正しいか確認してください。
  3. コンソールのエラーメッセージを確認
    テスト中にエラーが発生した場合、Unityのコンソールウィンドウにエラーメッセージが表示されます。エラー内容を読み取り、原因を特定してください。
  4. 床が動かない場合
    • 「MoveUp」スクリプトのFloorMoveメソッドが呼び出されているかをデバッグしましょう。例えば、Debug.Logを使ってスクリプトの動作を確認します。
    public void MoveStart() { Debug.Log("MoveStartが呼び出されました"); StartCoroutine("FloorMove"); }
  5. 動きが速すぎる/遅すぎる場合
    上昇速度を調整したい場合は、transform.Translate(0, 0.02f, 0);の数値を変更してください。例えば、0.02f0.05fにすれば速度が速くなります。

これで、上昇する床の動作確認と調整方法は完了です!必要に応じて設定を微調整し、理想の動きを目指しましょう。



よくある質問

Q
エリアに入っても床が動かない場合の対処法は?
A

エリアに入っても床が動かない場合、以下の点を確認してください:

  • 「Area」オブジェクトに Box Collider が正しく設定されているか確認しましょう。特に「Is Trigger」のチェックが外れていると動作しません。
  • プレイヤーのスクリプト「SphereMove」で、upFloor に正しいオブジェクトがアタッチされているか確認してください。
  • 上昇床にアタッチしたスクリプト「MoveUp」にエラーがないかもチェックしましょう。
Q
上昇速度を変更するにはどうすればいいですか?
A

スクリプト「MoveUp」の transform.Translate(0, 0.02f, 0); の数値 0.02f を変更することで上昇速度を調整できます。

  • 値を大きくすると速くなり、小さくすると遅くなります。
  • また、yield return new WaitForSeconds(0.01f); の数値を大きくすると、動きが滑らかになりますが遅く感じることがあります。
Q
床が途中で止まってしまうのはなぜですか?
A

床が途中で止まってしまう場合、スクリプト「MoveUp」の以下の条件を確認してください:

while (pos.y < 3.0f)

この 3.0f は床が止まる高さを意味しています。この値を変更することで、床の移動範囲を調整できます。また、pos.y の取得に問題がないか、スクリプト全体を見直しましょう。

おすすめのアセット

「Elevator System Pro」は、Unityでリアルなエレベーターシステムを簡単に導入できるアセットです。直感的なインターフェースでエレベーターの動作やボタン操作を制御でき、複数階層や異なるデザインのエレベーターを簡単に作成可能です。カスタムサウンドやアニメーションも設定でき、ゲームやシミュレーションにリアリティを追加します。複雑なプログラムが不要で、初心者から上級者まで幅広く利用できるのが特徴です。