simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

Unity:uGUIボタンとゲームロジックの縫い合わせ方法

前書き

ユーザーによる画面入力とゲームのロジックが接続される箇所を探すと、ボタンが大部分を占めます。
ボタンを押した時にどのプログラムが起動するかを UI オブジェクトから漏れなく、間違いなく辿れなければなりません
(※個人的な意見です)

が、そうしないプログラムが多く、実際メンテナーに大きなプロジェクトを引き継いだ時
ボタンを押したらバトルが始まるのに、そのボタンを押した時に実行されるプログラムがコードから見つけられない、処理フローを限定できないという大問題が発生します。

これを避ける良いプログラミング例が無いかなぁと考えて、自分は以下のようにしています。

QuitGameButton に割り当てるスクリプト実装

QuitGameButton.cs

using UnityEngine;
using UnityEngine.UI;

[RequireComponent(typeof(Button))]
public class QuitGameButton : MonoBehaviour
{
    void Start()
    {
        _button = GetComponent<Button>();
        _button.onClick.AddListener(OnClick);
    }

    private void OnClick()
    {
        Application.Quit();
#if UNITY_EDITOR
        UnityEditor.EditorApplication.isPlaying = false;
#endif
    }

    Button _button;
}

Unity のチュートリアルだとインスペクタで呼び出す関数を onClick イベントに登録しますが、それだとインスペクタの設定項目とコード実装接続を人間が行わなければならず
ヒューマンエラーが起きやすく、作業者の集中リソースを消費して会社の労働力が減ってしまいます。

そこで、上記の通り、Start 関数内で AddListner 関数を用いてコード側でボタンとロジックを接続するようにしました。
このルールが徹底されていれば、押下するボタンに割当たっているスクリプトを調べれば、漏れなく処理フローを、間違えることなく把握できるようになります。

(このルールが徹底されていれば…問題はちょっと実装が面倒くさい点ですね、多くの人はインスペクタからイベントに関数を登録してしまいます…)