[UNITY]複数のボタン制御用クラスの実装

ボタンはゲーム作成になくてはならない処理ですが、いろいろな実装方法があってどれにするべきかわからないことがありますよね。
今回は複数のボタンを制御するためのクラスの実装をいくつか提案します。
自分は小規模アプリが多いので2番を使っています。

今回は、実行すると下図になるようプログラムを書いていきます。

ボタンごとにメソッドを作る

ボタンごとにメソッドを作るのは定番というか、Unityの入門書には大体こう書いてあるので
結構これから抜けられなかったりしますよね。

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

public class ButtonManager : MonoBehaviour
{
    public Text textbox;

    public void TappedButton1()
    {
        textbox.text = "ボタン1が押されました。";
    }

    public void TappedButton2()
    {
        textbox.text = "ボタン2が押されました。";
    }

    public void TappedButton3()
    {
        textbox.text = "ボタン3が押されました。";
    }

}

このクラスをボタンにアタッチして、ボタン毎にOn Click 時に呼び出すメソッドを変えていきます。

これで完成です。

メリット :仕組みがわかりやすい
デメリット:システムが大規模化したときに可読性が落ちる

Switch-Case文で引数ごとに処理を変える。

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

public class ButtonManager : MonoBehaviour
{
    public Text textbox;

    public void TappedButton(string button)
    {
        switch (button)
        {
            case "button1":
                textbox.text = "ボタン1が押されました。";
                break;
            case "button2":
                textbox.text = "ボタン2が押されました。";
                break;
            case "button3":
                textbox.text = "ボタン3が押されました。";
                break;
            default:
                break;
        }
    }
}

このクラスをボタンにアタッチして、ボタン毎にOn Click の引数を変えていきます。

これで完成です。

メリット :メソッドが1つになる。
デメリット:引数で文字を間違えると動かなくなる

列挙型enumを使ってボタン毎にクラス変数を変える

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

public class ButtonManager : MonoBehaviour
{
    public Text textbox;
    public ButtonType buttonType;

    public enum ButtonType
    {
        button1,
        button2,
        button3
    };

    public void TappedButton()
    {
        switch (buttonType)
        {
            case ButtonType.button1:
                textbox.text = "ボタン1が押されました。";
                break;
            case ButtonType.button2:
                textbox.text = "ボタン2が押されました。";
                break;
            case ButtonType.button3:
                textbox.text = "ボタン3が押されました。";
                break;
            default:
                break;
        }
    }
}

このクラスをボタンにアタッチして、ボタン毎にOn Click のクラス変数を変えていきます。

これで完成です。

ただ、これは設計中に新たにボタンを追加したいときは注意が必要です。
button1とbutton2の間にbutton1aを追加したいとしましょう。
すると、列挙型の一番下に書くのは見栄えが悪いので以下のように書きがちです。

    public enum ButtonType
    {
        button1,
        button1a,
        button2,
        button3
    };

こうすると、今まで設定してたクラス変数がずれるので、見直す必要が出てきます。
button1は大丈夫だが…

button2はbutton1aに

button3はbutton2に

まぁenemを使わず string 型にしてもいいんでしょうけど、メリットデメリットは2と変わらないですね

メリット :誤字などのミスが大幅に減る
デメリット:作成途中で改修することになったときにすべてを見直す必要がある。

このほかに、便利な方法ありましたら是非ご教授ください。

コメント

タイトルとURLをコピーしました