やりたいこと
以下の記事ではボタンをInspecterからセットして使用しています。
しかしコールバックを設定した後にボタンはクラス内で使用しないためメンバーで持つ必要もなく、またコードを書くことになれた人間から見るとわざわざGUIでボタンを設定するのも手間です。(コードを見てもセットされたボタンがどれなのかもわかりにくい)
そこでコード上からボタン(Button)を取得する方法を紹介します。
以前のコード
上の記事では以下のコードを書きました。
m_ButtonをInspecterで設定しています。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Example : MonoBehaviour
{
public Button m_Button;
void Start()
{
m_Button.onClick.AddListener(() => ButtonClicked(42));//クリック時の関数を登録 42は任意の引数
}
void ButtonClicked(int buttonNo)////引数は必要な型に変更可能
{
Debug.Log("Button clicked = " + buttonNo);///ログ出力
/*クリック時の処理*/
}
}
実装
以下のように変更を行います。
メンバ変数m_Buttonを削除
GameObject.Find(“ButtonName”)でGameObjectを取得します。
”ButtonName”はInspecterで設定している名前です。
GameObjectからボタンComponentを取得します。このComponentが外部から設定されたButtonと同様にok_btn.onClick.AddListenerを呼ぶことができます。
public class Example : MonoBehaviour
{
void Start()
{
Button ok_btn = GameObject.Find("ButtonName").GetComponent<Button>();
ok_btn.onClick.AddListener(() => ButtonClicked(42));
}
void ButtonClicked(int buttonNo)////引数は必要な型に変更可能
{
Debug.Log("Button clicked = " + buttonNo);///ログ出力
/*クリック時の処理*/
}
}
余談
Buttonだけでなく他のインスタンスも取得することができます。
RawImageなら以下の通りです。RawImage‗NaneはButtonと同様にInspecterで設定した名前。
GameObject.Find("RawImage‗Name").GetComponent<RawImage>();
結果
InspecterからButtonを設定せずにScriptだけでButtonを取得、コールバックを設定することができました。
コメント