【解決】リスナー登録でArgumentOutOfRangeException

ラムダ式でのButton.onClickへの引数ありのリスナー登録で、ArgumentOutOfRangeExceptionエラーが出る件の解決方法。

原因

リスナー登録の引数で変数を渡した場合、「クリックイベントが発生した時点での変数の値」が入る模様。

こんな風に書いたら、全てのリスナーにshopItemButtonList.Countの値が渡されて、範囲外のインデックスになった。


//駄目な例
	for (int i = 0; i < shopItemButtonList.Count; i++) {
		shopItemButtonList[i].onClick.AddListener(() => PurchaseItem(i));
	}

解決法

ループ内でローカル変数を作成し、一旦噛ませると、その都度作られて別々の値になる。


	for (int i = 0; i < shopItemButtonList.Count; i++) {
		int index = i;
		shopItemButtonList[index].onClick.AddListener(() => PurchaseItem(index));
	}

参考リンク

Stack Overflowに同様の質問があった。

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