【Unity】Rigidbodyを使わない落下のシミュレーション

2024年9月13日

Unityでは、オブジェクトがジャンプした後、自然に落下する動きを再現することができます。通常は「Rigidbody」というコンポーネントを使いますが、時には「CharacterController」を使うことで物理演算を避けつつ、落下やジャンプをシンプルに表現することが求められます。

ここでは、Rigidbodyを使わないで落下を実現する方法を学びます。


1. 基本となる式

落下のシミュレーションに必要な式は次の通りです。

playerVelocity.y += gravityValue * Time.deltaTime;

この式で、キャラクターがジャンプ後に地面に向かって自然に落ちてくる動作を実現できます。式を構成する各部分について、簡単に説明します。

playerVelocity.y

キャラクターの縦方向の速度を表しています。ジャンプするとプラス(上向き)、落下するとマイナス(下向き)になります。

gravityValue

重力の強さを示す値です。通常は負の値(例: -9.81)を使い、地面に向かって引っ張られる力を表します。

Time.deltaTime

前のフレームからの経過時間を表します。フレームごとの違いを考慮し、キャラクターの動きを滑らかにします。


2. 落下を実現する理由

キャラクターがジャンプした後、重力によって徐々に加速しながら落下する様子をゲームで再現するには、この式が必要です。

式の「+=」という部分では、フレームごとに重力の影響が加わるため、速度が徐々に増していきます。このようにして、現実的な落下動作が実現されます。


3. シンプルな落下シミュレーションの流れ

  1. ジャンプ開始: playerVelocity.yが初期値0から始まります。
  2. 重力の影響を受ける: フレームごとにplayerVelocity.yに重力値が加算されます。
  3. 落下速度が増す: プレイヤーの速度が徐々に下向きに加速していきます。
  4. 地面に到着: 地面に接触したらplayerVelocity.y = 0にリセットされ、落下が終了します。

4. 例:簡単なジャンプと落下のコード

以下は、簡単なUnityのスクリプト例です。

public class PlayerMovement : MonoBehaviour
{
    public CharacterController controller;
    public float speed = 12f;
    public float gravity = -9.81f;
    private Vector3 playerVelocity;

    void Update()
    {
        if(controller.isGrounded && playerVelocity.y < 0)
        {
            playerVelocity.y = 0f;
        }

        // ジャンプボタンが押されたらジャンプ
        if (Input.GetButtonDown("Jump") && controller.isGrounded)
        {
            playerVelocity.y += Mathf.Sqrt(3f * -2f * gravity);
        }

        // 重力の影響を受ける
        playerVelocity.y += gravity * Time.deltaTime;

        // キャラクターの移動
        controller.Move(playerVelocity * Time.deltaTime);
    }
}

5. まとめ

  • Rigidbodyを使わずにCharacterControllerでキャラクターを落下させることは、物理演算を避けつつ、ゲーム内の動きを精密にコントロールしたい場合に有効です。
  • gravityValueTime.deltaTimeを使うことで、現実的な落下動作を簡単にシミュレートできます。

記号を除いたバージョンで、これでさらに読みやすくなったと思います。

Unity

Posted by hidepon