プレハブからボタンを配置するときには OnClick イベントを設定する必要がある。
引数を渡すとき処理を書くときに一工夫必要だったので覚書き。
まず AddListener はアクションを渡す必要があるので、そのまま Func(1) みたいには渡せない。
そこでラムダ式で簡単な無名関数を作って渡すようにする。
このときループのインデックスなんかを渡すと、変数そのものが渡されるので全部ループ終了後のインデックス値が設定されたりする。
計算結果を渡せば良いかとも思ったがそれもダメだった。
最終的にループ内で一時変数を作って渡すことで正しく動作するようになった。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void Init(){ for(int i=0;i<=5;i++){ GameObject b = Instantiate( Resources.Load("Button", typeof(GameObject)) as GameObject ); b.GetComponent<Button>().onClick.AddListener( SomeAction(i) ); //コンパイルエラー b.GetComponent<Button>().onClick.AddListener( () => SomeAction(i) ); //全部6になる b.GetComponent<Button>().onClick.AddListener( () => SomeAction(i+0) );//全部6になる int ii = i + 0; b.GetComponent<Button>().onClick.AddListener( () => SomeAction(ii) );//正しく動作 } } void SomeAction(int i){ Debug.Log(i); } |
ありがとうございます!!!!!
丸三日、この問題で頭を抱えていたので、本当に助かりました!!