使用unityAction预期的方法名称

时间:2015-10-14 09:27:42

标签: c# unity3d

你好,我遇到了一些问题。我知道这对你来说很容易解决,但我无法解决。

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);
    }
}

编译器说预期的方法名称

1 个答案:

答案 0 :(得分:2)

UnityAction是代表:

public delegate void UnityAction(); 

所以,在ctor中你需要传递一个委托。在您当前的snippter中,您尝试调用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
}