2017-02-23 5 views
0

私はトグルにリスナーを追加しようとするまで動作するリストから動的に追加されたトグルのリストを作成しようとしています。 SelectColorに渡される値は、各トグルに対して1ずつ増加しますが、渡される値は配列の長さとまったく同じです。各トグルの最後のインデックスの上に常に1のインデックスを置く。Toggleに動的addListener

foreach (HexLand color in colors) { 
    Toggle option = Instantiate<Toggle> (ColorTogglePrefab); 
    option.transform.SetParent (EditorOptions.transform); 
    option.name = "Toggle " + color.Name; 
    option.group = toggleGroup; 
    if (i == 0) { 
     option.isOn = true; 
    } else { 
     option.isOn = false; 
    } 
    option.GetComponent<HexLandOption>().label.text = color.Name; 
    option.onValueChanged.AddListener (delegate { 
     SelectColor (i); // current usage has array length 2. i always returns 2. 
    }); 
    i++; 
    } 
public void SelectColor(int index) { 
    Debug.Log(index); // Writes 2 to console. 
    activeColor = colors [index].Color; 
} 

各トグルが正しく値を返すために使用できる方法はありますか?

+0

を参照してください? – Programmer

+0

これが私の最初の試みでした。それは同じ結果をもたらした。いつも返されます。 –

答えて

0

外部のスコープからiをキャプチャしています。デリゲートは即座に実行されないので、コールバックが発生すると、iには配列の長さである最後の値が既にあります。

ループ内に別の変数を作成して、反復の値を格納します。

は、forループを使用し、たぶんHow to tell a lambda function to capture a copy instead of a reference in C#?

+0

私はそれを私が必要とするものに合う形に正しく変換する方法がわかりません。私はデリゲートになるとデリゲートでどのように働くことになるのかよく分かりません –

+0

デリゲートの前に変数を追加し、 'i'の代わりにそれを使用します: ' var index = i; option.onValueChanged.AddListener(delegate { SelectColor(index); }); ' – Nerlog

+0

値が範囲外にならないようになりましたが、現在は配列で使用可能な最後の値のみが返されます。 –