【Unity】OnCollisionEnterの衝突相手のゲームオブジェクトの名前を確認するには(親子の場合、親のオブジェクトも)

これを実現するためには、、ゲームオブジェクトの親オブジェクトを取得方法を知る必要があります
次の親子関係の一覧表示のコードをもとにして、衝突時の親(先祖)を辿るコードを作成していきます

親子関係の一覧を表示

Unityには、Transform クラスの parent プロパティを使用して、親子関係を表現することができます。このプロパティを使用して、先祖の一覧を表示することができます。

以下は、先祖の一覧を表示する方法の例です。この例では、オブジェクトのすべての先祖を順番に表示するために、Transform クラスの parent プロパティを使用しています。

using UnityEngine;

public class AncestorList : MonoBehaviour
{
    void Start()
    {
        Transform ancestor = transform.parent;
        while (ancestor != null)
        {
            Debug.Log(ancestor.gameObject.name);
            ancestor = ancestor.parent;
        }
    }
}

このスクリプトを GameObject にアタッチすると、そのオブジェクトの親子関係で先祖の一覧を表示することができます。具体的には、Start() メソッドが呼び出されたときに、transform.parent を使用して親オブジェクトを取得し、その親オブジェクトの親オブジェクトを取得し、というように続けて、オブジェクトの先祖を順番に表示します。最後に、最上位の親オブジェクトに到達すると、parent プロパティは null を返すため、ループを終了します。

コライダーに衝突したゲームオブジェクトの名前を確認する

サンプルシーン

衝突される側

スクリプト

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CollisionCheck : MonoBehaviour
{
    void OnCollisionEnter(Collision collision)
    {
        string root = $"{gameObject.name}のコライダーに [{collision.collider.gameObject.name}";

        Transform ancestor = collision.collider.gameObject.transform.parent;

        while (ancestor != null)
        {
            root += $" -> {ancestor.gameObject.name}";
            ancestor = ancestor.parent;
        }

        root += "] が衝突した";
        Debug.Log(root);
    }
}

このスクリプトは、コライダーが衝突した際に呼び出されるOnCollisionEnterメソッドを持っています。このメソッドは、引数にCollisionオブジェクトを受け取ります。Collisionオブジェクトには、衝突した相手の情報が含まれています。

OnCollisionEnterメソッドでは、まずgameObject.nameを使用して、このスクリプトがアタッチされているオブジェクトの名前を取得しています。次に、Collisionオブジェクトから相手のオブジェクト名を取得して、root変数に文字列として追加します。

その後、collision.collider.gameObject.transform.parentを使用して、相手オブジェクトの親オブジェクト(祖先)を取得し、whileループで祖先をたどっていきます。祖先がなくなるまで、root変数に「->」とともに祖先のオブジェクト名を追加します。最後に、root変数に"] が衝突した"という文字列を追加して、Debug.Logメソッドでログ出力しています。

このスクリプトは、オブジェクト同士の衝突時に、自分自身と相手オブジェクトの名前を表示し、相手オブジェクトの親オブジェクト名をたどって表示することができます。

衝突する側

実行結果

Headのコライダーに [Nose -> Head -> Enemy] が衝突した

参考

Unity

Posted by hidepon