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

Ridigbodyコンポーネントを使うと、オブジェクトの位置をシミュレートしてくれますが、CharacterControllerコンポーネントのようにRigidbodyを使わないケースで落下(ジャンプしてそのまま落ちてくる)を実現したいこともあります

playerVelocity.y += gravityValue * Time.deltaTime;

この式 playerVelocity.y += gravityValue * Time.deltaTime; は、Unityにおける物理シミュレーション、特に重力がキャラクターに与える影響を模倣するために使われます。ここで、各変数の意味を詳しく見ていきましょう:

  • playerVelocity.y:これは、キャラクターの垂直方向(Y軸)の速度を表します。Unityの世界では、Y軸は上下方向を指します。この値を更新することで、キャラクターの上昇や下降を制御できます。
  • gravityValue:重力の強さを表す値です。地球の重力加速度は約9.81 m/s²(メートル毎秒毎秒)ですが、この値は通常、ゲーム内でのリアルさやプレイ感に応じて調整されます。ここでは負の値 -9.81 を使用していますが、これはキャラクターが下向き(地面に向かって)に加速することを意味します。
  • Time.deltaTime:前のフレームからの経過時間(秒)です。この値を使うことで、ゲームのフレームレートに依存せずに、一定の速度や加速度を保持することができます。つまり、どのようなハードウェアでも、キャラクターの動きが一貫して感じられるようになります。

式全体 playerVelocity.y += gravityValue * Time.deltaTime; の動作を簡単に説明すると、キャラクターの垂直方向の速度(playerVelocity.y)に、重力加速度(gravityValue)と経過時間(Time.deltaTime)の積を加算しています。これは、フレームごとにキャラクターにかかる重力の影響をシミュレートし、よりリアルな落下動作を作り出すためです。

結果として、キャラクターが空中にいるとき(地面に接触していないとき)、この式はキャラクターの下向きの速度(落下速度)を徐々に増加させます。キャラクターが地面に接触すると、通常はこの速度をリセットし(playerVelocity.y = 0)、キャラクターの無限の落下を防ぎます。これにより、重力の影響下での落下やジャンプの際の下降を、ゲーム内で自然に感じさせることができます。

+=で足していく意味は?

重力の効果をシミュレートするために速度に重力値を足し込む理由は、物体が自由落下する際の物理法則に基づいています。自由落下する物体の速度は、時間が経過するにつれて一定の割合で増加します。これは、重力が一定の加速度を物体に与え続けるためです。具体的には、地球上での重力加速度は約9.81メートル毎秒毎秒(m/s²)です。これは、物体の速度が毎秒9.81メートル毎秒ずつ増加することを意味します。

ゲーム内でこの現象を模倣するには、各フレームでキャラクターの垂直方向の速度に重力加速度を考慮した値を加える必要があります。これを実現する最もシンプルな方法は、フレームごとに次の式を適用することです:

playerVelocity.y += gravityValue * Time.deltaTime;

ここで、gravityValueは重力加速度(ゲーム世界における)、Time.deltaTimeは前フレームから現在のフレームまでの経過時間(秒)です。この計算によって、キャラクターの垂直方向の速度は、実際の時間の流れに応じて一貫して増加します。

シンプルな例

例えば、あるキャラクターが高い場所からジャンプして地面に落下し始めたとします。最初、垂直方向の速度(playerVelocity.y)は0です(上向きに移動していないと仮定)。次の瞬間、重力が作用し始め、キャラクターの速度は負の方向(下向き)に変化します。

  • 最初のフレームでは、playerVelocity.y0 + (gravityValue * Time.deltaTime)になります。つまり、gravityValue-9.81で、Time.deltaTime0.02秒(約1/50秒、一般的なゲームフレームレート)の場合、速度は約-0.1962メートル毎秒になります。
  • 次のフレームでは、この新しい速度に再びgravityValue * Time.deltaTimeが加算され、速度はさらに下向きに増加します。

このプロセスが続くことで、キャラクターの落下速度は徐々に増加し、リアルな落下動作がシミュレーションされます。重力値を足し込むことで、キャラクターが自由落下する際の加速度を正確に再現することができるのです。

CharacterControllerではRigidbodyを使えない理由

CharacterController コンポーネントと Rigidbody コンポーネントは、Unity でキャラクターの動きを制御するための異なるアプローチを提供します。両者はそれぞれ独自の利点がありますが、一緒に使用することは推奨されていません。これにはいくつかの理由があります:

  1. 物理演算との相互作用の方法: CharacterController は、主にキャラクターの移動と衝突検出を独自の方法で処理し、物理演算を直接使用しません。これに対して Rigidbody は、Unity の物理エンジンによって制御される物理ベースの動きに使用されます。CharacterController はキャラクターの動きをより細かく制御したい場合に適しており、滑らかな移動やジャンプ、階段の昇降などの特定のキャラクター操作を実装するのに便利です。
  2. コントロールの精度: CharacterController を使用すると、開発者はキャラクターの動きに対してより高いレベルの制御を持つことができます。例えば、重力、ジャンプ、地面との衝突処理などを自分で定義し、キャラクターの動きを正確にコントロールできます。Rigidbody を使用すると、物理エンジンによる自然な物理挙動が期待できますが、キャラクター制御における予測不可能な挙動や、より一般的な物理反応が生じる可能性があります。
  3. パフォーマンスの考慮: CharacterController は、計算が軽量で、キャラクターの移動や衝突検出に特化しています。対照的に、Rigidbody は物理演算を利用するため、特に多数の物理オブジェクトが関与するシーンでは、パフォーマンスに影響を与える可能性があります。

CharacterControllerRigidbody の両方にはそれぞれ利点がありますが、CharacterController はキャラクターの動きを直接的かつ詳細に制御したい場合に適しています。一方で Rigidbody は、物理的に正確な相互作用や、物理エンジンを利用したリアルな動きが求められる場合に適しています。そのため、これらを一緒に使用するのではなく、プロジェクトのニーズに応じて適切なコンポーネントを選択することが重要です。

Unity

Posted by hidepon