[Unity]引数によるボタンの判別

# はじめに
<!-- 発端や概要を記載 -->
Unityを使ってゲームを開発している時、1つの画面に色んなボタンがあって管理がめんどくさいとかどこのボタンを押したのかを判定させたいってことはありませんか？
僕自身ユーザーが複数あるボタンのうちどのボタンを押したのかをどうやって判別しようか、実装の仕方に迷いました。その結果、「引数」と「switch文」を用いてもしかしたら汎用性あるかもしれない実装が出来たので記事に残します。


**開発環境**
>Unity version - 2020.3.10f1
 Visual Studio Code version - 1.55.2 

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [引数とは](#Chapter1)
1. [switch文とは](#Chapter2)
1. [ボタンの判別](#Chapter3)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 引数とは
そもそも引数って色んなサイトでみるけど結局何？って方もいると思います。
簡単にいうと引数とは**「関数に渡す値」**のことです。関数は色々な処理をして何かしらの値を出力しますよね。その処理で使うために関数に渡す値を引数と言います。（またその関数が処理を行って出力した結果のことを戻り値や返り値と言います。）

簡単な例を用いて引数を考えてみます。

```C#:argument.cs
void Start()
    {
        Plus(1); //ここで引数を１としてPlusを呼び出す。
    }
    void Plus(int argument) //()の中にある　int argument　が今回の引数です。関数の（）の中にあるものは引数であると考えて問題ないと思います。（多分）
    {
        int plus = argument + 1; //引数に対して1を足したものをplusに代入。
        Debug.Log(Plus); //Unity上でコンソールに表示。
    }
```
これを実行するとコンソールには2が出力されます。
PC上で行われている順番的には、
①void Start内のPlus関数をを読み込む
②引数argumentが1だった場合でのPlus関数を計算
③コンソールに表示
です。

他にも引数に2を指定したらコンソールには3、100を指定したらコンソールには101が表示されるといった感じなります。これで引数を「関数に渡す値」と説明した意味が伝わっているのではないでしょうか。

<a id="#Chapter2"></a>
# switch文とは
では次はSwitch文についてです。この文法はif文とイメージが似ていて一度使えばなんとなく頭に入ると思います。
Switch文は、「複数の条件分岐をするのに対応している」文法です。
といってもみたほうが早いと思うので実際に使っている例をみてみます。

```C#:Switch.cs
void Start()
    {
        SwitchPractice(); //関数を呼び出す。
    }
   void SwitchPractice()
    {
        int num = Random.Range(1, 5); //numに1〜4の整数をランダムで代入。ちなみに半開区間なので5は含まれません。
        switch (num)
        {
            case 1: //numが1の時に実行。
                Debug.Log("case1"); 
                break; //switch文から脱出。
            case 2: //numが2の時に実行。
                Debug.Log("case2");
                break; //switch文から脱出。
            default: //numが3もしくは4の時に実行。
                Debug.Log("default"); 
                break; //switch文から脱出。
        }
    }
```
こんな感じです。numを引数にしていますね！
PC上での順番的には、
①void Start内のSwitchPractice関数をを読み込む。
②numにランダムで1〜4の整数を代入。
③switch文を読み込みnumに入った整数に対応した処理をする。
④コンソールに表示
という感じです。
defaultというのはif文でいうelseのようなものでそれ以外の時、つまりこの場合3、4の時に読み込まれます。

複数の処理内容を分岐させたい場合、ネストしたif文を書いていくでもいいですがswitch文を使ってみると効率的に書くことができますので、もし使えそう！って場合は是非switch文を書いてみてください。

<a id="#Chapter3"></a>
#ボタンの判別
ではいよいよボタンの判別をしてみます。
![スクリーンショット 2021-08-24 4.59.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1651299/3cc79680-d8fc-042b-9a15-f1f46fd688bd.png)
このようにボタンを３つ作ってみました。
（ButtonManagerはemptyでButtonスクリプトがアタッチしてある。）
それではそれぞれのボタンが押されたらA、B、Cに対応してコンソールでもA、B、Cと出力させる実装をしていきます。
スクリプトはこんな感じです。

```C#:Button.cs
public void ABCButton(int num) //ここに引数を入れておくことでそれぞれのボタンごとにUnity側で引数を指定できる。
    {
        switch (num)
        {
            case 1: //押されたボタンのUnity側で設定された引数が1のだったとき
                Debug.Log("Aのボタンが押されたよ");
                break;
            case 2: //押されたボタンのUnity側で設定された引数が2のだったとき
                Debug.Log("Bのボタンが押されたよ");
                break;
            case 3: //押されたボタンのUnity側で設定された引数が3のだったとき
                Debug.Log("Cのボタンが押されたよ");
                break;
        }
    }
```
ボタンの関数に引数を入れておくことが肝になっています。何が肝なのか？このスクリプトを保存してUnityでボタンの設定をしていくと
![スクリーンショット 2021-08-24 5.01.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1651299/b5a36ded-0d26-9a4a-b062-d91708785760.png)
引数が指定できます！！
これをそれぞれのボタンで指定して実行すると
![スクリーンショット 2021-08-24 5.15.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1651299/22db1e8e-63f1-5be8-ba0c-c1e888efe633.png)

それぞれどのボタンが押されたのかを判定することができました！

数が増えてくるとボタンごとに関数を宣言するのは大変だったりスクリプトが見づらくなってしまうこともあると思うので、もしこの記事を見たら試してみてください。