技術資料:Unity 2Dでキャラクターが動く床に乗ると一緒に動く仕組み

Unity 2Dアプリでキャラクターが動く床に乗った際、床と一緒に動く動作を実現するためにはいくつかの方法があります。この資料では、その中から3つの方法を紹介します。各方法にはそれぞれのメリット・デメリットがあるため、プロジェクトの状況に応じて選択してください。


方法1:キャラクターを床の子オブジェクトにする方法

最初の方法は、キャラクターが床に乗ったときにキャラクターを床の子オブジェクトとして扱うことで、床と一緒に動かす方法です。

手順

  1. 床の作成
    GameObject > 3D Object > Cube で床を作成し、スプライトや2Dアセットを使用して見た目を設定します。床に Rigidbody2D コンポーネントをアタッチし、Body TypeKinematic に設定します。
  2. 床のスクリプト:MovingPlatform.cs
   using UnityEngine;

   public class MovingPlatform : MonoBehaviour
   {
       public float speed = 2f;          // 床の移動速度
       public float moveDistance = 5f;   // 移動距離
       private Vector3 startPos;         // 床の初期位置
       private int direction = 1;        // 移動方向

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

       void Update()
       {
           transform.position = new Vector3(startPos.x + Mathf.PingPong(Time.time * speed, moveDistance) * direction, transform.position.y, transform.position.z);
       }
   }
  1. キャラクターのスクリプト:CharacterOnPlatform.cs
   using UnityEngine;

   public class CharacterOnPlatform : MonoBehaviour
   {
       private Transform platformTransform;

       private void OnCollisionEnter2D(Collision2D collision)
       {
           if (collision.gameObject.CompareTag("MovingPlatform"))
           {
               platformTransform = collision.transform;
               transform.SetParent(platformTransform);  // キャラクターを床の子オブジェクトにする
           }
       }

       private void OnCollisionExit2D(Collision2D collision)
       {
           if (collision.gameObject.CompareTag("MovingPlatform"))
           {
               transform.SetParent(null);  // 床との親子関係を解除
           }
       }
   }
  1. 動作確認
    キャラクターが床に乗ったとき、床と一緒に動くことを確認します。

メリット・デメリット

  • メリット:簡単に実装でき、安定して動作します。
  • デメリット:キャラクターのスケールや回転が床の影響を受ける場合があるため、これらの影響を避けたい場合には他の方法を検討します。

方法2:床の移動量をキャラクターに加算する方法

床の移動量をキャラクターに反映させることで、床の動きに連動させる方法です。

手順

  1. 床の作成と移動は方法1と同じです。
  2. キャラクターのスクリプト:CharacterOnMovingPlatform.cs
   using UnityEngine;

   public class CharacterOnMovingPlatform : MonoBehaviour
   {
       private Transform platformTransform;
       private Vector3 lastPlatformPosition;
       private bool onPlatform;

       private void OnCollisionEnter2D(Collision2D collision)
       {
           if (collision.gameObject.CompareTag("MovingPlatform"))
           {
               platformTransform = collision.transform;
               lastPlatformPosition = platformTransform.position;  // 床の初期位置を記録
               onPlatform = true;
           }
       }

       private void OnCollisionExit2D(Collision2D collision)
       {
           if (collision.gameObject.CompareTag("MovingPlatform"))
           {
               onPlatform = false;
           }
       }

       private void Update()
       {
           if (onPlatform)
           {
               // 床の移動量をキャラクターに加算
               Vector3 platformMovement = platformTransform.position - lastPlatformPosition;
               transform.position += platformMovement;
               lastPlatformPosition = platformTransform.position;
           }
       }
   }
  1. 動作確認
    床の移動に伴ってキャラクターも移動することを確認します。

メリット・デメリット

  • メリット:キャラクターのスケールや回転に影響を与えずに動かせる。
  • デメリット:床の動きが極端に速い場合に滑らかに動かないことがある。

方法3:FixedJoint2D を使った物理的な接続方法

FixedJoint2D を使ってキャラクターと床を物理的に結合することで、自然な物理動作を実現します。

手順

  1. 床の作成と移動は方法1と同じです。
  2. キャラクターのスクリプト:AttachToPlatformWithJoint.cs
   using UnityEngine;

   public class AttachToPlatformWithJoint : MonoBehaviour
   {
       private FixedJoint2D fixedJoint;

       private void OnCollisionEnter2D(Collision2D collision)
       {
           if (collision.gameObject.CompareTag("MovingPlatform"))
           {
               fixedJoint = gameObject.AddComponent<FixedJoint2D>();
               fixedJoint.connectedBody = collision.rigidbody;  // 床のRigidbody2Dに接続
           }
       }

       private void OnCollisionExit2D(Collision2D collision)
       {
           if (collision.gameObject.CompareTag("MovingPlatform"))
           {
               Destroy(fixedJoint);  // 床から降りたときに接続解除
           }
       }
   }
  1. 動作確認
    床に乗ったときにキャラクターが物理的に床に固定され、床と一緒に動くことを確認します。

メリット・デメリット

  • メリット:物理演算を使用するため、自然な動きが実現されます。
  • デメリット:過度な物理演算が必要な場合やパフォーマンスに影響が出る可能性がある。

まとめ

この技術資料では、Unity 2Dでキャラクターが動く床に乗ったときに一緒に動かす3つの方法を紹介しました。

  • 方法1:キャラクターを床の子オブジェクトにする方法は、簡単で信頼性がありますが、床の影響を受けやすいです。
  • 方法2:床の移動量をキャラクターに加算する方法は、柔軟で多くの状況に対応します。
  • 方法3FixedJoint2D を使った方法は、物理演算に基づいた自然な動きを実現しますが、場合によってはパフォーマンスに影響があることもあります。

プロジェクトに応じて適切な方法を選択してください。

Unity

Posted by hidepon