为什么终止for循环会导致NavMeshAgent开始移动得更快?

时间:2018-04-28 23:45:25

标签: c# unity3d

这段代码工作得很好,但是一旦树木盯着进入他们的1000个实例,它似乎暂停了。 navmesh代理只会在它的当前位置等待,直到新批树被放入然后只移动到一个并再次暂停时才会执行任何操作。但是一旦我终止了for循环,它就会根据需要不断地从一个树移动到另一个树。为什么是这样?一旦解决了OnCollision代码,我认为它更新了框架。是因为列表中有太多东西需要排序吗?

代码:

    void OnCollisionEnter(Collision collision)
{
    GameObject data = GameObject.Find("Data");
    List<GameObject> treeLists = data.GetComponent<DataStorage>().treeList;
    for (removeArea = 0; treeLists.Count > removeArea; removeArea++)
    {
        if (treeLists[removeArea] != null)
            if (collision.gameObject.name == treeLists[removeArea].name)
             {
                 GameObject.Destroy(collision.gameObject);
                 treeLists[removeArea] = null;
                 removeArea = treeLists.Count; //Added this 
             }
    }
}

removeArea应该是我决定废弃的其他东西。它不会在代码中的任何其他地方使用。

有没有办法让它在渲染下一帧之前处理for循环?

1 个答案:

答案 0 :(得分:0)

如果您有大量工作需要完成,并且不能完全适合单个更新,请使用coroutine。但在您的情况下,您可能只需要改进算法。

由于您只提供了OnCollisionEnter,我只能帮助改进此方法,您将负责修改其余代码以对其进行测试。

首先将treeList中的List类型更改为HashSet中的DataStorage。当您想要快速插入,删除和包含时,集合很棒。有关sets的更多信息。有了它,您将不再需要遍历整个集合来查找谁碰撞。删除循环还允许您从集合中删除GameObject权限。这是必要的,因为您不能在集合中重复(最初将gameObject引用设置为null)。您的新OnCollisionEnter现在是:

void OnCollisionEnter(Collision collision) {
    GameObject data = GameObject.Find("Data");
    var treeList = data.GetComponent<DataStorage>().treeList;

    // compare references
    if (treeList.Contains(collision.gameObject)) {
        treeList.Remove(collision.gameObject);
        GameObject.Destroy(collision.gameObject);
    }
}

我希望这会有所帮助并让你走上正确的道路。