[Unity]uGUIで、ボタンのクリックイベントを自動でセットする。

UnityのuGUIを使用してボタンを作る場合、Unityのインスペクタで設定するか、もしくはボタンのonClick.AddListener()メソッドを使用してイベントハンドラの登録が必要です。

画面中に存在するボタンが少ない場合はこの方法で問題ないのですが、
ボタンの数が多くなってくるとこの作業が大変になってきます。

このような場合は、リフレクションクラスを使うと、
名前合わせでイベントハンドラを自動登録することができます。

下記のコードを使用すると、例えば下記の場合にbtnStartのOnClickイベントとしてbtnStart_Onclick()を割り当ててることができます。
1.Hierarchy上に”btnStart”という名前を持つuGUIのボタンがある。
2.本スクリプト上にbtnStart_Onclick()メソッドがある。


これで、面倒なハンドラの登録を手動で行う必要がなく効率よく開発を行うことができます。

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Reflection;
 
public class MainSceneScript : MonoBehaviour {
 
    void Start () {
        //ボタンがクリックされたときのハンドラを登録
        SetButtonClickHandler();
    }
 
    // Startボタンがクリックされたときのハンドラ
    public void BtnStart_OnClick() {
        Debug.Log ("BtnStart_OnClickがコールされました");
    }
 
    // 解答ボタンがクリックされたときのハンドラ
    public void BtnAnswer_OnClick() {
        Debug.Log ("BtnAnswer_OnClickがコールされました");
    }
 
 
    /// <summary>
    /// ボタンにイベントハンドラを割り当てる。
    /// ex:Hierarchy上に"btnStart"という名前を持つuGUIのボタンがあり、
    ///    かつ、本スクリプト上にbtnStart_Onclick()メソッドがある場合、
    ///    btnStartのOnClickイベントとしてbtnStart_Onclick()を割り当てる。
    /// </summary>
    private void SetButtonClickHandler() {
 
        // ボタン一覧を取得
        Button[] buttonList = FindObjectsOfType<Button>();
 
        // メソッド一覧を取得
        BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static;
        MethodInfo[] methodList = this.GetType().GetMethods( flags );
 
        // すべてのボタンにハンドラを登録するまで繰り返し
        foreach (Button curBtn in buttonList ) {
            string searchMethodName = curBtn.name.ToUpper() + "_ONCLICK";
 
            // ボタンへイベントハンドラを登録する
            MethodInfo handlerMethod = null;
            foreach ( MethodInfo curMethod in methodList ) {
                // ボタン名 + "_OnClick"の名前のメソッド以外はSkip
                if ( curMethod.Name.ToUpper() != searchMethodName ) {
                    continue;
                }
 
                // ボタンクリック時のハンドラを登録する
                curBtn.onClick.AddListener( delegate { curMethod.Invoke( this, null ); } );
                Debug.Log( "クリックのイベントハンドラを登録しました name=" + curBtn.name );
                break;
            }
        }
    }
}


関連記事

コメントを残す

メールアドレスが公開されることはありません。