本日は Unity の小ネタ枠です。
Unityで様々なFind関数を使ってシーン内のオブジェクトを検索する方法についてです。
GameObject.FindとTransform.Find
Find関数にはGameObject.FindとTransform.Findの2種類があり、それぞれ以下の違いがあります。
関数 | 検索範囲 | 検索対象 | 戻り値の型 | 備考 |
---|---|---|---|---|
GameObject.Find | シーン全体 | アクティブオブジェクトのみ | GameObject | static関数 |
Transform.Find | 直下の子オブジェクトのみ | 非アクティブを含む | Transform |
サンプルシーン
以下の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関数では参照トランスフォーム直下以外のオブジェクトは検索に失敗していることが分かります。