一般的なルールとして、もしゲームの中で 移動するゲームオブジェクトを使用する場合 Rigidbody オブジェクトとする べきです。 Rigidbody は ゲームオブジェクトが物理挙動(Physics)により 影響を受けるためのコンポーネントです。 オブジェクトが重力により落下し、 重量(Mass)、抵抗(Drag)、速度(velocity) などといった物理挙動のプロパティをもちます。 Rigidbody コンポーネントをゲームオブジェクトに 追加すると、そのオブジェクトを Rigidbody オブジェクトと 呼ぶことがよくあります。 Rigidbody コンポーネントはあらゆる物理挙動の伴う相互作用に 必要であり、ゲームオブジェクトは コライダをアタッチしないと 他の物理挙動のあるオブジェクトと相互作用できません。 Rigidbody がないと powerCube は宙に浮いたままです。 しかし、Rigidbody を追加したときに何が起きるかみてみます。 他のコンポーネントと同様に インスペクタの最下部にある Add Component ボタンを使用するか トップメニューの Component メニューを使用します。 Physics セクションの配下でみつけることが出来ます。 これでゲームオブジェクトは重力により落下し、 物理エンジンおよび加えられた力により 制御されます。 Rigidbody にはさまざまなオプションがあります。 最初にゲームオブジェクトの Mass Drag, Angular Drag が制御できます。 オブジェクトの Mass により オブジェクトの衝突の処理方法に影響します。 Mass の大きいゲームオブジェクトほど Mass の小さいゲームオブジェクトと衝突したときに 小さな作用をします。 ゲームオブジェクトの Drag は 他の作用がない場合にどれぐらい早く減速するかに 影響します。 空気抵抗と考えると良いです。 これは線形の速度の減少割合を決めるのに 使用されます。 同様にして、Angular Drag はゲームオブジェクトがいかに Angular Velocity、すなわち どれぐらい早く回転速度を減速するかにも 影響します。 例えば、もしオブジェクトにトルクを加えて 回転させる場合、 Angular Drag はこの力に抵抗を 作ります。次のオプションは ゲームオブジェクトが重力(Gravity)により影響を受けるかどうか です。 このチェックボックスを有効にすることにより重力を使用します。 重力の設定については Unity の Edit - Project Settings - Physics メニューにてみることができます。 みてのとおり 3 次元のベクトルであり デフォルトでは現実世界と同様 -9.81 という値です。 ここでグローバルにカスタマイズすることが出来るため 興味深いエフェクトを作ることが出来ます。 例えば横スクロールゲームでの弱い重力とか パズルゲームの一部として 様々な軸として使用することさえ出来ます。 例えば、 Z 軸に 5 という値を 重力に加えてみましょう。 これで powerCubet はグローバル空間座標での Z 軸に 向かって引っ張られます。 Is Kinematic オプションにより Rigidbody が物理挙動に対して反応するか決定します。 通常、シーンが開始するときすべての static な物体、 つまり、Rigidbody のないオブジェクトは 物理エンジンによりチェックされ パフォーマンスのためそれ以降はチェックされません。 しかし、もし static オブジェクトを移動した場合 物理エンジンは再度すべての static オブジェクトを 正確性の観点で再チェックを行い、 これはパフォーマンスにとって負荷となります。 これを回避するため、 Kinematic Rigidiby オブジェクトを使用して その Transform を通して Translate 関数を使用して移動させることが出来ます。 これはつまり Physics オブジェクトについて 他にオブジェクトに影響するけれども自身には影響しないものを作成することが出来ます。 分かりやすい例は Pong または Breakout といったスタイルのゲーム(※アルカノイドのような)でのパドルがあります。 このサンプルでは Rigidbody powerCube は Use Gravity オプションがチェックされています。 Play ボタンを押下すると、オブジェクトは地面に落下します。 さらに丸い prop_samoflange Ball オブジェクトがあり、同様のコンポーネント設定を となっています。 もし powerCube に重力がない場合 その下に落ちませんが、 他のオブジェクトにより影響されます。 もし他のオブジェクトにより影響されたくない場合 Is Kinematic を使用することができます。 前述のとおり オブジェクトはその Transform を通して 動かすことが出来ます。このシンプルなスクリプトを 使用して Tranlate 関数を使用して 毎フレームごとに forward 方向に移動できます。 みてのとおり、オブジェクトは 他のオブジェクトと相互作用しますが Rigidbody のままであるため、 物理エンジンに現在位置を伝えて 物理エンジンが シーン全体を再評価しないようにします。 Interpolate および Extrapolate は 揺らぎ(Jitter)を回避します。 もしオブジェクトのわずかな動きが Rigidbody により動かす時に発生する場合 Interpolate 設定を使用することで 前フレームにもとづいた Transform 動作のスムージングを 行ないます。そして Extrapolate 設定により 次フレームの位置予測にもとづいた スムージングを行ないます。 次の設定は 衝突判定(Collision Detection)のタイプです。 Discrete, Continuous, および Continuous Dynamic があります。 デフォルトは Discrete であり、 問題ないかぎり Discrete を使用するべきです。 Continuous は高速のオブジェクトで static な物体と相互作用がある場合に使用します。 Continous Dynamic は高速なオブジェクトで 他の Dynamic オブジェクトと相互作用がある場合に 使用します。 最後に Rigidbody コンポーネントの Constraints セクションにより オブジェクトの動作または回転の 物理挙動を制限させることが できます。例えば、 もしテトリスのようなゲームがあった場合 ゲームのブロックが落下するときに 回転させる必要があります。 ここの Rotation Constraints を使用することで制限すべきです。 このサンプルでは powerCube は workbench 上に落下します。これは Rigidbody であり Use Gravity が有効化されています。 標準どおり、次のように落下します。 もし落下するについれて回転させたくない場合 Constraints のなかで回転をフリーズすることが出来ます。 これで落ちるときに回転が発生しません。 (翻訳:gamesonytablet)