のにっき

【Unity】AddListnerに引数が必要な場合の対処法

Unityでコンポーネントにイベントを設定するとき、AddListner()をよく使用します。
このAddListnerですが、
イベントの種類によっては引数が必要になる場面があるのをご存知でしょうか?
今回は、ラムダ式でイベント設定する時の注意をまとめたいと思います。

ボタンにイベントを設定する

/***********************************************************************
【メイン】ボタンにイベントを設定する関数
***********************************************************************/
public void SetBtnPushEventListner()
{
    // 【引数なし】ボタンイベント設定
    Button btn_Set;
    btn_Set = this.transform.Find("設定するオブジェクト名").GetComponent<Button>();
    btn_Set.onClick.AddListener(() => { SetBtnPushEvent_NoHikisuu(); });
    // 【引数あり】ボタンイベント設定
    Button btn_Set02;
    btn_Set02 = this.transform.Find("設定するオブジェクト名").GetComponent<Button>();
    btn_Set02.onClick.AddListener(() => { SetBtnPushEvent_Hikisuu("引数"); });
}

/***********************************************************************
【Ev】ボタン押下イベント ※引数なし
***********************************************************************/
public void SetBtnPushEvent_NoHikisuu()
{
    Debug.Log("押されたよ, 引数なし");
}
/***********************************************************************
【Ev】ボタン押下イベント ※引数あり
***********************************************************************/
public void SetBtnPushEvent_Hikisuu(string SetHikisu)
{
    Debug.Log("押されたよ, 引数あり:"+SetHikisu);
}

上記の書き方で、ボタンコンポーネントにクリックイベントを設定できます。

btn_Set02.onClick.AddListener(() => { SetBtnPushEvent_Hikisuu("引数"); });

この部分がイベントを設定する部分なのですが、
設定するコンポーネントの変数.イベント名.AddListener(() => { 関数名; });
という書き方で、ボタンに限らず大体のコンポーネントのイベントを設定できます。

イベント自体に引数がある場合

onClickイベントはイベント自体に引数が無いので、
イベントの引数を意識せずにAddListenerで設定することが出来ます。
しかし、イベント自体に引数がある場合は関数設定時にイベント引数を設定する必要があります。
Sliderのイベントを例に設定方法を記入します。

/***********************************************************************
【メイン】スライダーにイベントを設定する関数
***********************************************************************/
public void SetSliderChangeEventListner()
{
    // 【引数なし】ボタンイベント設定
    Slider setSlider;
    setSlider= this.transform.Find("オブジェクト名").GetComponent<Slider>();
    setSlider.onValueChanged.AddListener((value) => { SetChangeSlider_Vol((int)value); });
}

/***********************************************************************
【Ev】スライダー更新
***********************************************************************/
public static void SetChangeSlider(int SetVal)
{
    Debug.Log("スライダーの値が変更されたよ:" + SetVal.tostring());
}

上記の書き方で、スライダーコンポーネントにクリックイベントを設定できます。
onClickイベントとの違いは、AddListener((value) => { SetChangeSlider_Vol((int)value); });
この「value」の部分ですね。 これは、「 onValueChanged 」イベント自体の引数です。
value=変更されたスライダーのvalueになります。
このように、イベント自体の引数が存在する場合は、
ラムダ式の左辺に任意の変数名(例の場合はvalue部分)を記述する必要があります。

イベント名から引数があるか判定する方法

①.実際に記入してエラーで判別

イベント自体に引数があるかないかの判定は簡単です。
onClickイベントの記法で、引数が無いものとして記述してみる。
この方法で記述して、
・ビルドエラーなし・・・イベント引数ない
・ビルドエラーある・・・イベント引数あり

これで一発です。
引数がある場合は、以下の方法で引数の内容を確認しましょう。

②.Googleで検索

後はインターネッツにおまかせ! 「 Unity イベント名.AddListener
で検索しましょう。
これで大体のイベントの引数は検索できます。
私がSliderの引数の内容で詰まった時は、「 Unity onValueChanged.AddListener 」で検索しました。

ラムダ式でイベント追加を行うと、 イベント引数を簡単に持ってこれるのでとても便利です。