MRが楽しい

MRやVRについて学習したことを書き残す

Unityで様々なFind関数を使ってシーン内のオブジェクトを検索する その2(GameObject.FindとTransform.Find)

本日は Unity の小ネタ枠です。
Unityで様々なFind関数を使ってシーン内のオブジェクトを検索する方法についてです。

GameObject.FindとTransform.Find

Find関数にはGameObject.FindとTransform.Findの2種類があり、それぞれ以下の違いがあります。

関数 検索範囲 検索対象 戻り値の型 備考
GameObject.Find シーン全体 アクティブオブジェクトのみ GameObject static関数
Transform.Find 直下の子オブジェクトのみ 非アクティブを含む Transform

docs.unity3d.com
docs.unity3d.com

サンプルシーン

以下のFind関数で検索を行うサンプルスクリプトとサンプルシーンを作成しました。
・FindTest2.cs

using UnityEngine;

public class FindTest2 : MonoBehaviour
{
    [SerializeField]
    private Transform _rootTransform;
    
    void Start()
    {
        // GameObject.Findでオブジェクト名が"Cube"、"ChildCube"または"GrandChildCube"のオブジェクトを検索して情報をログに表示する
        FindGameObject("Cube");
        FindGameObject("ChildCube");
        FindGameObject("GrandChildCube");
        
        // Transfrom.Findでオブジェクト名が"Cube"、"ChildCube"または"GrandChildCube"のオブジェクトを検索して情報をログに表示する
        FindTransform(_rootTransform, "Cube");
        FindTransform(_rootTransform, "ChildCube");
        FindTransform(_rootTransform, "GrandChildCube");
    }

    private void FindGameObject(string targetName)
    {
        var targetObject = GameObject.Find(targetName);
        if (targetObject == null)
        {
            Debug.LogError($"{targetName}オブジェクトが見つかりませんでした");
        }
        else
        {
            Debug.Log($"Name : {targetObject.name}, Position : {targetObject.transform.position}");
        }
    }

    private void FindTransform(Transform currentTransform, string targetName)
    {
        var targetTransform = currentTransform.Find(targetName);
        if (targetTransform == null)
        {
            Debug.LogError($"{targetName}オブジェクトが見つかりませんでした");
        }
        else
        {
            Debug.Log($"Name : {targetTransform.name}, Position : {targetTransform.position}");
        }
    }
}

シーンを再生すると、シーン内から検索条件に合ったオブジェクトを検索した結果がログで確認できました。
Transfrom.Find関数では参照トランスフォーム直下以外のオブジェクトは検索に失敗していることが分かります。