のりかつおの備忘録ブログ

Unity, AI, ゲームに関心がある鰹です。 ぴちぴち跳ねて精進します。

【Unity】子オブジェクトにRigidbodyをアタッチして親オブジェクトを移動させたときの動作

子にRigidbodyをアタッチしたときの挙動についていくらか混乱してしまったので備忘録としてまとめます。
こうしたらこうなったという知見的なものになりますが参考になれば幸いです。

動作状況

図のように親(ヒエラルキー上のParent)と子(ヒエラルキー上のChild)として、それぞれCubeオブジェクト(白色のCube)を用意します。
下側にある大きいほうのCubeが親で、上側にある小さいほうのCubeが子です。
OnTriggerEnterの発火用にもう一つCubeを追加して、区別がつきやすいよう赤色にして置いておきます(ヒエラルキー上のArea)。

子だけにBoxColliderをアタッチしてIsTrigger=Trueに設定します。
親にはあらかじめRIgidbodyをアタッチしておきます。

OnTriggerEnterが呼ばれたことが分かりやすいように、呼ばれたタイミングでオブジェクトを赤色に染めています。

以下の2通りで親オブジェクトを赤色のAreaに向けて移動させた結果をまとめました。
(1) rigidbody.velocityを変更して速度を与える方法
(2) transform.positionで位置を直接変更する方法
f:id:norikatuo:20210126002949p:plain

1. 子にRigidBodyがアタッチされていない場合

子は親の移動(rigidbodyによる移動, transform.positionによる移動)に追従する。
子のColliderの接触時には親と子の両方のOnTriggerEnterが呼ばれる。
f:id:norikatuo:20210126011542g:plain

2. 子にRigidBodyがアタッチされている場合

  • 子のRIgidbodyがIskinemati=Falseの場合

    子は親の移動(transform.positionによる移動)に追従する。
    子のColliderの接触時には子のOnTriggerEnterのみが呼ばれる。

Rigidbodyによって親に速度を与えた場合

f:id:norikatuo:20210126013203g:plain

Transform.positionを変更して親を動かした場合

f:id:norikatuo:20210126012845g:plain

  • 子のRIgidbodyがIskinemati=Trueの場合

    子は親の移動(rigidbodyによる移動, transform.positionによる移動)に追従する。
    子のColliderの接触時には子のOnTriggerEnterのみが呼ばれる。

f:id:norikatuo:20210126013925g:plain

3. まとめ

子のRigidbody 子のIsKinematic 親のRigidbodyによる移動に追従 親のtransformによる移動に追従 子のColliderが衝突時
なし - 親子共にOnTriggerEnter
あり False × 子のOnTriggerEnter
あり True 子のOnTriggerEnter

※検証の簡易化のためIsTrigger=Trueの結果です。