キネマティックボディ
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 6/63。
動く足場、リフト、ドアは固体の物体のように衝突する必要がありますが、それらの上に何が乗っても、落下したり押し動かされたりしてはいけません。これがキネマティックボディです。rb.isKinematic = trueを設定すると、重力、力、衝突によって動かされなくなります。コライダーは引き続き有効なので、動的ボディ(物理演算によって動くボディ)は壁にぶつかるように衝突し、床に立つようにその上に乗ります。キネマティックボディは、rb.MovePositionを使って自分で動かします。
このリフトは、topに達するまで毎秒liftmの速度で上昇します。MovePositionには、このステップの後の位置を渡すため、コードではTime.fixedDeltaTimeを使って1ステップ分の移動量を加えます。
void Start()
{
rb = GetComponent<Rigidbody>();
rb.isKinematic = true;
}
void FixedUpdate()
{
if (rb.position.y < top)
{
rb.MovePosition(rb.position + Vector3.up * lift * Time.fixedDeltaTime);
}
}なぜtransform.positionを設定しないのでしょうか?それではオブジェクトがテレポートし、物理演算は移動したことを認識しません。そのため、スライドする足場の上の木箱は一緒に運ばれず、取り残されてしまいます。MovePositionは、ステップ中にボディが新しい位置まで移動したことを物理演算に伝えるため、接触しているものは適切に運ばれ、押されます。キネマティックボディに対してAddForceは何も作用せず、キネマティックボディは静的コライダーとも互いに衝突しません。動的ボディだけがキネマティックボディに衝突します。
チャレンジ
簡単はしけは溶岩の上に浮かんでおり、矢印キーで x 軸に沿って左右に speed m/s(Inspector で 2)で滑らせます。現在、Rigidbody は通常のものなので、溶岩に落ちてしまいます。
- ゲーム開始時には、はしけをキネマティックにして、空中に浮かせ、ぶつかったものに押しのけられないようにします。
- 生の Horizontal 軸を使って、
FixedUpdate()内でMovePositionを使って動かします。
Play を押してはしけを滑らせてから、Check を押します。
自分で試してみよう
using UnityEngine;
public class Barge : MonoBehaviour
{
public float speed = 2f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
// はしけをキネマティックにする
}
void FixedUpdate()
{
// 矢印キーで x 軸に沿ってはしけを動かす
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。