UnityUnityメモ

Unity 動く床に乗った際にプレイヤーも一緒に動く仕組み

Unity

はじめに

こんにちは!今回は、ゲーム内でキャラクターが動く床に乗ったときに一緒に動く仕組みを作ってみましょう。これは、エレベーターや動くプラットフォームのあるゲームでよく使われるテクニックです。

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



動く床の作成

まずは、動く床を作成しましょう。

オブジェクトを配置

  1. 新しい3Dオブジェクトの作成
    ヒエラルキーウィンドウで右クリックして、「3D Object」→「Cube」を選びます。このCubeが床になります。
  2. 床のサイズ調整
    インスペクターウィンドウで、Transformコンポーネントの「Scale」を調整して床の大きさを変更します。例えば、Xを5、Yを0.5、Zを5にすると、広い床になります。

タグを設定

  1. 床オブジェクトを選択し、インスペクターウィンドウで「Tag」を「MovingPlatform」に設定します



床を動かすスクリプトの作成

  1. プロジェクトウィンドウで右クリックして、「Create」→「C# Script」を選び、スクリプトに「MovingPlatform」と名前を付けます。次に、このスクリプトを床オブジェクトにドラッグ&ドロップしてアタッチします
  2. MovingPlatformスクリプトをダブルクリックして、以下のコードを追加します:
using UnityEngine;

public class MovingPlatform : MonoBehaviour
{
    public Vector3 pointB;
    private Vector3 pointA;
    public float speed = 2.0f;

    void Start()
    {
        pointA = transform.position;
    }

    void Update()
    {
        float time = Mathf.PingPong(Time.time * speed, 1);
        transform.position = Vector3.Lerp(pointA, pointB, time);
    }
}

スクリプトの解説

コード全体の説明

このスクリプトは、床(プラットフォーム)が2つの地点の間を行ったり来たりする動きをします。pointApointBがその2つの地点で、speedは移動する速度です。

各部分の説明

  1. using UnityEngine;
    • Unityの機能を使うための宣言です。必ず最初に書きます。
  2. public class MovingPlatform : MonoBehaviour
    • MovingPlatformというクラスを作成しています。MonoBehaviourを継承することで、Unityのスクリプトとして動くようになります。
  3. public Vector3 pointB;
    • pointBは床が移動する先の地点を表す3次元ベクトルです。publicなので、Unityのインスペクターで設定できます。
  4. private Vector3 pointA;
    • pointAは床が移動する元の地点を表す3次元ベクトルです。privateなので、スクリプト内でしか使えません。
  5. public float speed = 2.0f;
    • 床の移動速度を設定するための変数です。デフォルトでは2.0に設定されています。
  6. void Start()
    • ゲームが始まるときに一度だけ呼ばれる関数です。ここでpointAの位置を現在の床の位置に設定しています。
  7. void Update()
    • 毎フレーム(画面が更新されるたび)呼ばれる関数です。ここで床の位置を計算して更新します。
  8. float time = Mathf.PingPong(Time.time * speed, 1);
    • Mathf.PingPong関数を使って、時間経過に基づいた0から1までの値を繰り返し生成します。これにより、床が往復する動きをします。
  9. transform.position = Vector3.Lerp(pointA, pointB, time);
    • Vector3.Lerp関数を使って、pointAからpointBまでの間をスムーズに補間します。timeの値に基づいて床の位置を更新します。

全体の動き

  • ゲームが始まると、床の元の位置pointAが設定されます。
  • 毎フレーム、Update関数が呼ばれて、timeという変数に0から1までの値が交互に入ります。
  • transform.positionがこのtimeに基づいてpointApointBの間を移動します。
  • これにより、床が往復移動するようになります。
  1. このスクリプトでは、床がpointA(初期位置)とpointBの間を行き来するようにします。speedは床の移動速度です。
  2. pointBの設定
    インスペクターウィンドウで、pointBの値を設定します。例えば、Xを10にすると、床はX軸方向に10ユニット動くようになります。



キャラクターが床と一緒に動く仕組み

次に、キャラクターが動く床に乗ったときに一緒に動くようにしましょう。

空のオブジェクトを作成

  1. ヒエラルキーウィンドウで右クリックして、「Create Empty」を選びます。
  2. この空のオブジェクトに「PlayerParent」と名前を付けます。

キャラクターを作成

  1. ヒエラルキーウィンドウで右クリックして、「3D Object」→「cube」を選びます。
  2. このキューブがキャラクターになります。適当に配置しておきましょう。

物理特性を追加

  1. インスペクター画面の「AddComponent」ボタンをクリックします。
  2. 「Rigidbody」を検索して追加します。



親子関係の設定

  1. キャラクターを「PlayerParent」の子オブジェクトにドラッグ&ドロップします。
  2. これで、PlayerParentを動かすとキャラクターも一緒に動くようになります。

スクリプトの作成

  1. プロジェクトウィンドウで右クリックして、「Create」→「C# Script」を選びます。
  2. スクリプト名を「PlayerOnPlatform」と名前を付けます。
  3. このスクリプトをキャラクター(Capsule)にドラッグ&ドロップしてアタッチします。
  4. PlayerOnPlatformスクリプトをダブルクリックして、以下のコードを追加します:

コード全体の説明

このスクリプトは、プレイヤーが動く床に乗ると床と一緒に動くようにし、床から降りると元の位置に戻るようにします。

各部分の説明

  1. using UnityEngine;
    • Unityの機能を使うための宣言です。必ず最初に書きます。
  2. public class PlayerOnPlatform : MonoBehaviour
    • PlayerOnPlatformというクラスを作成しています。MonoBehaviourを継承することで、Unityのスクリプトとして動くようになります。
  3. private Transform originalParent;
    • originalParentはプレイヤーの元の親オブジェクトを保存するための変数です。Transform型を使っています。
  4. void OnCollisionEnter(Collision other)
    • プレイヤーが何かに衝突したときに呼ばれる関数です。引数otherには衝突したオブジェクトの情報が入ります。
  5. if (other.gameObject.CompareTag(“MovingPlatform”))
    • 衝突したオブジェクトが「MovingPlatform」というタグを持っているかどうかをチェックします。
  6. originalParent = transform.parent;
    • プレイヤーの元の親オブジェクトをoriginalParentに保存します。
  7. transform.parent = other.transform;
    • プレイヤーの親オブジェクトを衝突した動く床に変更します。これにより、床と一緒に動くようになります。
  8. void OnCollisionExit(Collision other)
    • プレイヤーが何かとの衝突を終えたときに呼ばれる関数です。
  9. if (other.gameObject.CompareTag(“MovingPlatform”))
    • 衝突が終わったオブジェクトが「MovingPlatform」というタグを持っているかどうかをチェックします。
  10. transform.parent = originalParent;
    • プレイヤーの親オブジェクトを元のoriginalParentに戻します。これにより、プレイヤーは床から降りた後、床の動きに影響されなくなります。

全体の動き

  • プレイヤーが動く床に乗ると、OnCollisionEnter関数が呼ばれます。
  • 衝突したオブジェクトが「MovingPlatform」というタグを持っている場合、プレイヤーの親オブジェクトが動く床に変更されます。
  • これにより、プレイヤーは動く床と一緒に動きます。
  • プレイヤーが動く床から降りると、OnCollisionExit関数が呼ばれます。
  • プレイヤーの親オブジェクトが元の親オブジェクトに戻され、動く床の影響を受けなくなります。
using UnityEngine;

public class PlayerOnPlatform : MonoBehaviour
{
    private Transform originalParent;

    void OnCollisionEnter(Collision other)
    {
        if (other.gameObject.CompareTag("MovingPlatform"))
        {
            originalParent = transform.parent;
            transform.parent = other.transform;
        }
    }

    void OnCollisionExit(Collision other)
    {
        if (other.gameObject.CompareTag("MovingPlatform"))
        {
            transform.parent = originalParent;
        }
    }
}



テストプレイ

これで、キャラクターが動く床に乗ったときに一緒に動く仕組みが完成しました。Unityで実行して試してみてください。

床が動くとき、キャラクターも自然にその上で動くようになりましたね。いろんなシーンで応用できるので、自分のプロジェクトでもぜひ試してみてくださいね!



おすすめのアセット

2Dアクションプラットフォーマーキットは、Unityで簡単に2Dアクションゲームを作成できるテンプレートです。プレイヤーキャラクターの移動、ジャンプ、攻撃などの基本機能が揃っており、すぐにゲーム開発を始められます。このキットを使えば、プログラミングの知識がなくても自分だけのオリジナルゲームを作れます。

特徴

  • 簡単にカスタマイズできるキャラクターコントローラー
  • 多彩なエネミーAIとボスバトル
  • コイン収集やパワーアップアイテムの実装
  • 使いやすいレベルエディター
  • モバイルデバイス対応