🐷
Prefabからヒエラルキーのオブジェクトに触れる
最初に
Prefabは、ヒエラルキーにあるオブジェクトを登録しておけないので
Findとかで検索したりでアクセスする時があると思います。
よくネットを漁っていると、”Findはあんまり良くない”という意見を見かけるので
(実際、負荷はあるのだと思います)
UnityActionを使用して、Prefabからヒエラルキーにアクセスしてみます。
シチュエーションとしては
- Prefabにボタンを登録する
- ヒエラルキーからPrefabのボタンを生成する
- ボタンを押したら、元々ヒエラルキーにあったイメージをアクティブにする
作るスクリプトは
- ボタンに登録する ClickAction
- Prefab生成と、ボタンのアクションを登録する CallHierarchyFromPrefab
ClickAction
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
public class ClickAction : MonoBehaviour
{
// UnityActionを定義
public UnityAction buttonAction;
private void Start()
{
//buttonコンポーネントを取得
Button button = GetComponent<Button>();
//UnityActionを登録
button.onClick.AddListener(buttonAction);
}
}
上のスクリプトを、Buttonオブジェクトに登録してPrefab化します。
CallHierarchyFromPrefab
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class CallHierarchyFromPrefab : MonoBehaviour
{
public GameObject prefab;
public Canvas canvas;
public Image image;
void Start()
{
// ClickActionを持つPrefabを生成して、代入する
ClickAction clickAction = Instantiate(prefab, canvas.transform).GetComponent<ClickAction>();
// UnityActionに2つの関数を登録する
clickAction.buttonAction += Action1;
clickAction.buttonAction += Action2;
}
private void Action1()
{
Debug.Log("Action1");
}
private void Action2()
{
Debug.Log("Action2");
image.gameObject.SetActive(true);
}
}
上のスクリプトでPrefabの生成とアクションの登録をしています。
Discussion