Unity:物理 自由落下

今日は、Unityを使って簡単な物理計算をやってみようと思います。

跳ねるボールを作ってみます。

Unity上で球を上空へ配置した状態で、下記のスクリプトをアタッチします。

ゲットコンポーネントしますがUnityのrigidbodyは使用せずにMyRigidbodyというスクリプトを自分で定義します。

MyRigidbodyの中では加速度 速度 位置について時間ごとの計算を行います。

後に次のスクリプトでAddForceメソドを定義しますが、これで任意の方向に力を加えることができます。ここでは重力加速度になるようにy = -9.8としました。

通常のrigidbodyでgravityを定義できますが、今回はなるべく自分で定義していくことをコンセプトとしています。

球にアタッチする2つ目のスクリプトとしてMyRigidbodyを定義します。

加速度 速度 位置の変数をVector3型で用意します。

ステップ幅を1/60sとします。ここを1/600とすると 1/10スローモーションとして演算できます。

初期化のところでは、オブジェクトのtrasform.positionを取得するだけです。

AddForceメソドをpublicとして定義します。1つ目のスクリプトで読み込めるようにするためです。

で、引数として forceを入れます。さっきのVector3 (0f,-9.8f,0f)ですね。

このforceはaccelerationに加算されます。初期ステップ目では -9.8m/s2ということです。

1ステップ更新すると、このaccelerationに対して時間dt=1/60s を掛け算した値であるvelocityが計算され、さらにそのvelocityに時間dtを掛け算した変位(1ステップの移動量)positionが計算されます。

これでpositionはどんどん下がっていくので、床と衝突します。

衝突は、オブジェクトの中心座標分だけ床から浮いた状態を床との接触状態と考えてif文で検知したら速度を反転させ跳ね返るようにします。

最後にaccelerrationはゼロに初期化して、次のステップで再定義されるための準備をします。