Unityの物理エンジン・衝突: RigidbodyとCollidarとJoint

(2017-06-25)

Rigidbody

GameObjectを物理特性によって制御し、力の影響を受けるようにする。 Mass(質量)Drag(空気抵抗)Use Gravityなどのプロパティがある。

移動させるのに自分でTransformは変更せず力をかけて物理演算に任せる。 Is Kinematicにチェックを入れると物理エンジンによって移動しないようになるので、 Transformを直接変更する場合は有効にする。 ただし、スクリプトで動的にIs Kinematicを切り替えるのはパフォーマンスが良くない。

Collidar

RigidBodyの物理特性の境界を定義する。衝突させるには両方にCollidarが設定されている必要がある。 RigidBodyなしのCollidarを静的Collidarといって、無効にしたり移動しないことを前提に最適化される。 移動したりするものについてはRigidBodyを付けて、必要ならIs Kinematicを有効にする。

衝突時にはOnCollisionEnter() が呼ばれる。ほかに離れたときのOnCollisionExit()、 触れている間、毎フレーム呼ばれるOnCollisionStay()がある。

void OnCollisionEnter(Collision collision)
{
    foreach (ContactPoint contact in collision.contacts)
    {
        if (contact.otherCollider.tag == "Player")
        {
            Debug.Log(collision.relativeVelocity.magnitude);
        }
    }
}

Is Triggerにチェックを入れると物理エンジンには無視されてすり抜け、侵入に対してトリガーイベントが呼ばれる。 OnCollistionと同様に OnTriggerEnter()OnTriggerExit()OnTriggerStay() がある。

void OnTriggerEnter(Collider other)
{
    Debug.Log(other.tag);
}

Joint

Rigitbodyを他のRigitbodyとつなげるもの。 例えばSprint Jointだとオブジェクト間がばねのように伸縮する。

Spring Joint