ゲーム化!tomo_manaのブログ

ゲーム化!tomo-manaのブログ

Unityでゲームを作る方法について紹介しています

Unity/C# アプリ内のボタンを一括で登録する

アプリ内のボタンを一括で登録するコード。

ボタンの数が多くなると、管理が大変になってきますね…
いいアセットがあるのかもしれないのですが、ちょっとしたコードを自作してみました。

コード

ボタンを数える(ButtonCounter.cs)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

// rootObjects にあるすべてのボタンを登録する
public class ButtonCounter : MonoBehaviour
{
    [Header("走査するオブジェクト")]
    [SerializeField]
    List<GameObject> rootObjects;
    
    [Header("全ボタン 自動更新")]
    public List<Button> list = new List<Button>();
    
    // 単純な右手法による検索
    void CheckChild( Transform transform )
    {
        // ボタンあれば登録
        Button button = transform.gameObject.GetComponent<Button>();
        if( button != null ){
            list.Add( button );
        }
        
        // 子オブジェクトを検索
        for( int i = 0; i < transform.childCount; i++ ){
            Transform child = transform.GetChild(i);
            CheckChild( child );
        }
    }
    
    // 更新
    public void UpdateAll()
    {
        // 初期化
        list.Clear();
        
        // 全登録
        for( int i = 0; i < rootObjects.Count; i++ ){
            Transform child = rootObjects[i].transform;
            CheckChild( child );
        }
    }
}

一括更新ボタン(ButtonCounterWrapperEditor.cs)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

// ButtonCounter ボタンリスト一括更新ボタン
[CustomEditor(typeof(ButtonCounter))]
public class ButtonCounterWrapper : Editor
{
    // Inspector の GUI を更新
    public override void OnInspectorGUI(){
//      Debug.Log("OnInspectorGUI");
        
        //元のInspector部分を表示
        base.OnInspectorGUI();
        
        // ボタンが押されたら全部入れ替える
        if (GUILayout.Button("ボタン一覧更新")){
            Debug.Log("ボタンを押された");
            
            ButtonCounter2 counter = target as ButtonCounter2;
            counter.UpdateAll();
        }
    }
}

エディタ拡張を使用します。Editor拡張クラスはEditorフォルダ内に格納します。

ソースファイルの配置

コンポーネント(Inspector)

以下のコンポーネントが作成できます。

作成されるコンポーネント(Inspectorウィンドウ)

任意のゲームオブジェクトに付けられます。

動作例

ボタンを走査するオブジェクトを登録して、一括更新ボタンを押すと、オブジェクト配下の全部のボタンを拾ってくれます。

走査対象オブジェクトの選択・設定
ボタンの一括取得・更新

登録するオブジェクトは複数選択できます。

(参考)エディタ拡張:カスタムボタンの追加(いつもお世話になっております)
kan-kikuchi.hatenablog.com


(以上)