Unityの物理エンジン・衝突: RigidbodyとCollidarとJoint
unityRigidbody
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だとオブジェクト間がばねのように伸縮する。