目次
はじめに
スクリプトからボタンクリック時の挙動に、引数のあるメソッドを for文で登録する時にハマったので、回避方法のメモです。

サンプルコード
ハマったコード
using UnityEngine;
using UnityEngine.UI;
public class Temp : MonoBehaviour
{
[SerializeField] Button[] btn = new Button[35];
void Start()
{
for(int i = 0; i < btn.Length; i++)
{
btn[i].onClick.AddListener(() => Sample(i));
}
}
void Sample(int idx)
{
Debug.Log($"Num: {idx}");
}
}
上のコードだと、どのボタンを押しても同じ数字が書き出されてしまいます。

修正したコード
using UnityEngine;
using UnityEngine.UI;
public class Temp : MonoBehaviour
{
[SerializeField] Button[] btn = new Button[35];
void Start()
{
for(int i = 0; i < btn.Length; i++)
{
var j = i;
btn[i].onClick.AddListener(() => Sample(j));
}
}
void Sample(int idx)
{
Debug.Log($"Num: {idx}");
}
}
for(int i = 0; i < btn.Length; i++)
{
var j = i;
btn[i].onClick.AddListener(() => Sample(j));
}
for文の中で「i」を代入した変数「j」を宣言して引数にすることで、意図した実装になりました。それぞれのボタンに数値が割り振られた状態。

あわせて読みたい


【Unity】OnValidate メソッドについて
はじめに 大量のオブジェクトをInspectorに登録するのはけっこう大変な作業です。失敗するとバグにもなります。そんな時「OnValidate」メソッドがとても便利です。 OnVa...