【Unity】ボタンの「On Click」に引数のあるメソッドを for文で登録する時にハマった

  • URLをコピーしました!
目次

はじめに

スクリプトからボタンクリック時の挙動に、引数のあるメソッドを 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」メソッドがとても便利です。 ...

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次