ラムダ式での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に同様の質問があった。