unityAction期望的方法名

本文关键字:方法 期望 unityAction | 更新日期: 2023-09-27 18:17:32

你好,我遇到了一些问题。我知道这个问题对你来说很简单,但我解不出来。

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

unityAction期望的方法名

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
}