2015-10-14 25 views
1

你好我有一些問題。我知道這對你來說很容易,但我解決不了。方法名稱期望與unityAction

public ItemList itemList; 
UnityAction craft; 
List<Item> items = new List<Item>(); 

void Start() { 
    items = itemList.Items; 
    for (int i = 0; i < 5; i++) 
    { 
     craft = new UnityAction(itemList.Craft(items[i])); //There is a problem 
     Transform child = transform.GetChild(i); 
     child.GetChild(6).GetComponent<Button>().onClick.RemoveAllListeners(); 
     child.GetChild(6).GetComponent<Button>().onClick.AddListener(craft); 
    } 
} 

編譯器說的方法名預計

回答

2

UnityAction爲代表:

public delegate void UnityAction(); 

所以,在ctor你需要通過一個委託。在你目前的狙擊手中,你正試圖調用Craft方法而不是傳遞委託。

因此,要解決你的問題,你只需要編寫:

craft = new UnityAction(() => itemList.Craft(items[i])); 

另一個問題: 由於labmda被調用後,for循環可能會導致意想不到的結果 - 我幾乎可以肯定,所有Craft通話將被調用爲

itemList.Craft(items[5]) 

因爲i變量的最後一個值是5(循環結束之後) - 是的,這是價值持有。 所以,你還需要做:

for (int i = 0; i < 5; i++) 
{ 
    var localI = i; // copying val to local scope 
    craft = new UnityAction(() => itemList.Craft(items[localI])); 
    // other 
}