【问题标题】:Unity/NGUI Updating List at runtimeUnity/NGUI 运行时更新列表
【发布时间】:2014-05-06 13:43:31
【问题描述】:

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

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

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

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

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

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

我已经尝试将代码更改为

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

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

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

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

感谢您的阅读

【问题讨论】:

  • 请停止编辑问题,做一些愚蠢的小改动,这样你就可以得到一些愚蠢的徽章。
  • 这不是愚蠢的改变,你误导了 Unity 作为 .NET 的注入容器,而 Unity3d 作为游戏引擎。如果你想有正确的答案和观众,你应该确保你使用了正确的标签。

标签: unity3d unityscript ngui


【解决方案1】:

如果我给按钮添加一个回调,这样每当它们被拖放时,它就会运行上面的代码并添加附加的东西,例如,如果你只拖动一个“咒语”,它将循环一次,即很好,但是一旦您添加另一个,它就会循环 3 次,也就是说,它已经有一个,然后再次添加相同的一个,加上刚刚被拖动的新按钮,总共 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);
}

【讨论】:

    【解决方案2】:

    除了 Dover8 的响应之外,您可以首先检查 buttonList 是否已经包含对要添加的子项的引用。如果是,请继续。否则添加新的孩子。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多