概要
親子関係を持つオブジェクトの親と子で異なるTagをつけて、子が他のオブジェクトと衝突した場合にタグ検知するとなぜか親のタグしか認識されたなかったので、子のタグが認識される方法についてメモする。
検証の状況
- CubeにBoxColliderが付けてある
- 棒(Cylinder)にCapsuleColliderが付けてある
- 棒はキャラクター(RobotKyle)の子オブジェクトとして設定
- キャラクターにはTagとして”Player”を設定
- 棒にはTagとして”Stick”を設定
- キャラクターと棒にRigidbodyを設定


CubeにonCollisionEnterとして以下のスクリプトをアタッチして、衝突したタグを表示させる。
using System.Collections.Generic; using UnityEngine; public class CollisionTagTest : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } private void OnCollisionEnter(Collision collision) { Debug.Log(collision.gameObject.tag); } }
結果
stickが衝突しているはずなのにPlayerTagを検知してしまう。

原因と対処法
原因は子オブジェクトであるCylinderにRigidbodyをつけ忘れていた。改めてCylinderにRigidbodyをつけたところ、Stickを認識するようになった。

なお、PlayerからもCylinderからもRigidBodyを取り外したところ、Stickと認識された。
親子関係を持つオブジェクトに対し、OnCollisionEnterで検出されるTagはRigidBodyがついているオブジェクトが優先されるのかも。
つまり、親も子もRigidBodyがついていれば、実際に衝突しているオブジェクトのTagが読まれれるっぽい。