IT Learning

実践形式でITのお勉強

Unity

【Unity】OnCollisionEnterで子オブジェクトのTagを認識しない場合の対処法

投稿日:2020年10月26日 更新日:

概要

親子関係を持つオブジェクトの親と子で異なる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が読まれれるっぽい。

以上

Unityを一から学ぶのにおすすめの本はコチラ

Related

-Unity

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です