🐷

Prefabからヒエラルキーのオブジェクトに触れる

2022/12/21に公開

最初に

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