質問: GameObject.Instantiate(prefab) as GameObject; item.transform.SetParent(panel.transform, false); } } } ``` やりたいことは下記です。 <図> Canvas GameObjectA(デフォルトアクティブ)--GameObjectC(Button)←PrefabScript GameObjectB(デフォルト非アクティブ) <説明> 1)PrefabScriptはGameObjectAの子オブジェクトのGameObjectCにアタッチして prefabを生成しています。 2)1で生成されたprefabのボタンをタップするとGameObjectAを非アクティブにして GameObjectBをアクティブにしたい ``` public class ActiveScript : MonoBehaviour { [SerializeField]GameObject GameObjectA; [SerializeField]GameObject GameObjectB; public void SetActiveScript() { GameObjectA.SetActive(false); GameObjectB.SetActive(true); } } ``` 3)しかしこのActiveScriptを空のObjectにアタッチして作成しても prefabから参照することができません。 (prefabのインスペクタのOnClick()で参照できない) 4)かといってprefab内にActiveScriptを作ると 今度はGameObjectAとGameObjectBを参照することができません。 どうすればできるのでしょうか?分かる方お手数ですが教えて下さい。 環境) PC: mac Unity2018.2 言語:C#
回答: おそらく簡単なやり方としてはゲームオブジェクトを探し出すことです。 `GameObject.Find("オブジェクト名")` でHierarchy上でActiveな状態のオブジェクトは検索して探すことができます。これ以外にも方法はあるかと思いますので、あくまで一例として。 前提として、ActiveScriptをアタッチしているオブジェクトを「ActiveScriptObject」とします。 下記スクリプトをGameObjectC(Button)にアタッチしておきます(PrefabならPrefab内でアタッチ) ``` ActiveScript activeScript; void Start() { // ActiveScriptObject という名前のオブジェクトのコンポーネント ActiveScript を参照 activeScript = GameObject.Find("ActiveScriptObject").GetComponent(); } public void OnClickButton () { activeScript.SetActiveScript(); // ActiveScript 内の SetActiveScriptメソッドを実行 } ``` `Start()`の段階で「ActiveScriptObject」っていう名前でアクティブなオブジェクトをHierarchy上から探してきて、見つけたらそのコンポーネントのActiveScriptを参照しています。 `OnClickButton`を呼んでやると、さっき探してきたコンポーネントから`SetActiveScript`を実行しています。 非アクティブは見つからない ついハマりがちですが、アクティブじゃないオブジェクトはこのやり方だと探すことができません。 質問の例だと`GameObjectB(デフォルト非アクティブ)`は、非アクティブなのでFindしても見つかりません。ただし最初はアクティブにしておいてFindしてから、SetActiveで非アクティブにした場合は大丈夫です。 ``` GameObject hoge; void Start(){ hoge = GameObject.Find("hoge"); // Findして hoge を参照しておく hoge.SetActive(false); // オブジェクト hoge を非アクティブに } // このメソッドを実行するとオブジェクト「hoge」がアクティブになる public void HogeActive(){ hoge.SetActive(true); } ```