我想知道是否有人可以向我解释我如何在Unity中运行时更新列表?
例如我有一本法术书,里面有3个法术,当我把它们拖到我的行动栏时,他们会重新加入它,我要做的就是得到每个孩子的名单。动作栏转换,
我的问题是,如果我在更新中尝试类似下面的内容,实际上会做这样的事情,它会多次添加任何内容,我可以理解,因为更新每帧运行..
list = actionbarui.GetComponent(UIGrid).GetChildList();
for(var i =0;i < list.size; i++)
{
buttonList.Add(list[i].gameObject);
}
如果我在按钮上添加一个回调,那么每当它们被拖放时,它就会运行上面的代码并添加一些东西,就像在,如果你只拖动一个“咒语”就会循环一次,这是很好,但是一旦你添加另一个它循环三次,也就是说,它已经有一个它然后再添加相同的一个PLUS刚刚被拖动的新按钮总共3个。
我已尝试将代码更改为
list = actionbarui.GetComponent(UIGrid).GetChildList();
for each(var child : Transform in list.GetEnumerator())
{
buttonList.Add(child.gameObject);
}
但是这个简单不会添加任何东西,我不确定如何保持列表更新,因为它们被拖延,有人可以解释这是如何实现的吗?
请忽略第二个“列表”代码,它将“BetterLists”实现为NGUI的一部分,因此不遵循标准列表方法。
感谢您阅读
答案 0 :(得分:0)
如果我在按钮上添加一个回调,那么只要他们拖放它就会运行上面的代码并添加附加内容,如果你只拖一个&#34; spell&# 34;它会循环一次,这很好,但是一旦你添加另一个它循环三次,也就是说,它已经有一个它然后再添加相同的一个加上刚被拖动的新按钮共计3个。
这是预期的结果。您正在浏览子项列表并将其添加到您的按钮列表中,因此第一次只添加一个项目,然后当您添加另一个子项时,有两个项目要添加,从而产生三个项目。
要么没有for循环,请执行:
buttonList.Add(the_GameObject_that_was_just_added_to_the_bar);
或者在for循环之前清除你的buttonList:
list = actionbarui.GetComponent(UIGrid).GetChildList();
buttonList.Clear();
for(var i =0;i < list.size; i++)
{
buttonList.Add(list[i].gameObject);
}
答案 1 :(得分:0)
除了Dover8的响应之外,您还可以先检查buttonList是否已包含对要添加的子项的引用。如果是,继续。否则添加新的孩子。
但是,考虑到进行检查的费用,并且由于您已经在列表中循环,我建议您在运行循环之前按照他的建议清除列表。它可能会为您提供这些示例中的最佳性能。
如果您无法或不应该清除buttonList,并且仍然需要通过它,我建议您使用我的建议。这实际上取决于哪种实现最适合您尝试的操作。关键是有几种方法可以做到这一点,并且它们需要考虑不同的性能配置文件。