你好,我遇到了一些问题。我知道这对你来说很容易解决,但我无法解决。
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);
}
}
编译器说预期的方法名称
答案 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
}