0

我想知道是否有人可以向我解释如何在 Unity 运行时更新列表?

例如,我有一本法术书,里面有 3 个法术,当我将它们拖到我的操作栏时,它们会重新成为它的父级,我想要做的是在操作栏变换下获取每个孩子的列表,

我的问题是,如果我在更新中尝试以下类似的操作,它实际上会在哪里做这样的事情,它会多次添加那里的任何东西,我可以理解,因为更新每帧都会运行..

list = actionbarui.GetComponent(UIGrid).GetChildList();

for(var i =0;i < list.size; i++)
    {
    buttonList.Add(list[i].gameObject);
    }

如果我为按钮添加一个回调,以便每当它们被拖放时,它都会运行上面的代码并添加东西,例如,如果你只拖动一个“咒语”,它将循环一次,这很好,但是一旦您添加另一个,它就会循环三遍,也就是说,它已经有一个,然后再次添加相同的一个,再加上刚刚被拖动的新按钮,总共 3 次。

我尝试将代码更改为

list = actionbarui.GetComponent(UIGrid).GetChildList();

for each(var child : Transform in list.GetEnumerator())
    {
    buttonList.Add(child.gameObject);
    }

但是这个简单并没有添加任何东西,我不确定如何在列表被拖拽时保持更新,有人可以解释一下这是如何实现的吗?

请忽略第二个“列表”代码,它将“BetterLists”作为 NGUI 的一部分实现,因此不遵循标准列表方法。

感谢您阅读

4

2 回答 2

0

如果我为按钮添加一个回调,以便每当它们被拖放时,它都会运行上面的代码并添加东西,例如,如果你只拖动一个“咒语”,它将循环一次,这很好,但是一旦您添加另一个,它就会循环三遍,也就是说,它已经有一个,然后再次添加相同的一个,再加上刚刚被拖动的新按钮,总共 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);
}
于 2014-08-25T14:03:38.307 回答
0

作为 Dover8 响应的替代方法,您可以先检查 buttonList 是否已包含对要添加的子项的引用。如果是,请继续。否则添加新的孩子。

但是,考虑到进行检查的费用,并且由于您已经在循环列表中,我建议您按照他的建议在运行循环之前清除列表。它可能会为您提供这些示例中的最佳性能。

如果有一个原因你不能或不应该清除 buttonList,并且你仍然需要运行它,我会推荐我的建议。这实际上取决于哪种实现最适合您尝试做的事情。关键是有几种方法可以做到这一点,并且它们具有您需要考虑的不同性能配置文件。

于 2017-06-01T01:38:22.997 回答