Unityで非アクティブのGameObjectをスクリプトで取得(Find)する方法について説明します。
FindObjectsType<GameObject>(true)
FindObjectsTypeの引数にtrueを渡すことで、非アクティブのGameObjectも取得します。
public static Object[] FindObjectsOfType(Type type); public static Object[] FindObjectsOfType(Type type, bool includeInactive); public static T[] FindObjectsOfType(bool includeInactive); public static T[] FindObjectsOfType();
// Testという名前の非アクティブのGameObjectを取得する var gos = FindObjectsOfType<GameObject>(true); // 引数にtrueを渡して、非アクティブのGameObjectも含ませる foreach (var go in gos) { if(go.name == "Test") { // 処理 Debug.Log("Testが見つかりました。"); break; } }
非アクティブのGameObjectのComponentを取得する引数を持つメソッドは、他にGetComponentsInChildrenなどがあります。
parentGameObject.transform.Find(“Name”).gameObject
探したいGameObjectの親がわかっていれば、以下の記述で非アクティブのGameObjectでも取得できます。
// parentGameObjectは探したいGameObjectの親のGameObject var go = parentGameObject.transform.Find("Test").gameObject;
このメソッドで、親を持たない非アクティブのGameObjectを取得できるか調べてみましたが、調べた限りではできなさそうでした。
アクティブにしておいて、スクリプトで取得してから非アクティブにする
private GameObject TestGameObject { get; set; } void Start(){ TestGameObject = GameObject.Find("Test"); TestGameObject.SetActive(false); }
Inspectorでアサインする
あらかじめInspectorでアサインしておく方法もあります。
[SerializeField] private GameObject TestGameObject; // Inspectorでアサインする
おわりに
FindObjecsOfType<GameObject>(true)を紹介している記事が見つからなかったので記事にしました。参考になれば幸いです。