2017-05-08 84 views
0

我在运行时在Unity中编程切换按钮,我想添加一个事件来处理这些切换。如何添加到在Unity中Unity中的切换在Unity中,Unity#

我想添加到单击切换时触发的Unity事件,但我似乎无法将它正确绑定在一起。

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未定义,因为您的问题没有说明价值或用途。

确实注意到,如果你想通过i值,则需要将其复制到本地范围的变量(见this question为什么)第一名:

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方法)调用。