2017-05-08 15 views
0

実行時にUnityでプログラムトグルボタンを作成しています。これらのトグルにイベントを追加したいと思います。C#、UnityでToggleのUnityEventsを追加する方法

トグルをクリックしたときにトリガされるユニティイベントに追加したいが、それを適切に結びつけることができない。

public Toggle myToggle_Prefab; 
pulic int numberToggles; 
private Toggle[] runtimeToggles; 

private void Start() 
{ 
    runtimeToggles = new Toggle[numberToggles]; 
    for(int i = 0; i < runtimeToggles.Length; i++) 
    { 
      runtimeToggles[i] = Instantiate(togglePrefab); 
      // ADD TO THE EVENT HERE 
      runtimeToggles[i].onValueChanged.AddListener(MyMethod); 
    } 

} 

    private void MyMethod(int index){ 
     // Do something 
    } 

これは整数パラメータであるため、うまくいきません。このメソッドは次のようなブールパラメータで動作します。

private void MyMethod(bool arg0) 
{ 
    // Do stuff 
} 

しかし、私は何をしたいのかを行うために整数パラメータが必要です。何かご意見は?

答えて

2

あなたはこのようにそれを実行します。

for(int i = 0; i < runtimeToggles.Length; i++) 
{ 
     runtimeToggles[i] = Instantiate(togglePrefab); 
     // no-parameter version: 
     runtimeToggles[i].onValueChanged.AddListener(delegate{ MyMethod(thatInteger); }); 
     // boolean parameter version: 
     runtimeToggles[i].onValueChanged.AddListener(delegate (bool b){ MyMethod(thatInteger); }); 
} 

あなたは(何もパラメータまたはブール値のいずれかを取りません)デリゲートに呼び出し、そこから自分のメソッドを呼び出したいメソッドをラップします。あなたの質問は値が何であるかを示すものではないので、thatIntegerは未定義です。

は、最初に(this question理由についてを参照してください)あなたはi値を渡したい場合は、ローカル・スコープ変数にコピーする必要があることに注意してください:

for(int i = 0; i < runtimeToggles.Length; i++) 
{ 
     // like this: 
     int thatInteger = i; 
     runtimeToggles[i] = Instantiate(togglePrefab); 
     // no-parameter version: 
     runtimeToggles[i].onValueChanged.AddListener(delegate{ MyMethod(thatInteger); }); 
     // boolean parameter version: 
     runtimeToggles[i].onValueChanged.AddListener(delegate (bool b){ MyMethod(thatInteger); }); 
} 

ブールを経由して、私は、に変更されたことを表しています(つまり、チェックされると、そのブール値はtrueになります)。

イベントが最も可能性をカバーする、定義済みデリゲートメソッド(ぶっきらぼうそれらの署名が()(bool state)、および(UI.Toggle t)だろうと私はその最後の約100%わからないんだけど)の狭い範囲を呼び出すことができるので、それが動作する理由がありますイベントの使用。それ以外のものは、それらのいずれかに適合するデリゲートでラップされなければなりません。例えばdelegate{ f(int i); }がなければ、Unityの内部は、あなたがあなたのメソッドに渡したいものを知らないからです。

いいえ、公式文書にはこれらの署名は含まれていません(それは役に立たない)、内部のブードー魔法(多くのUnity MonoBehaviourメソッドのように)によって呼び出されます。

関連する問題