查找和收集 GameObjects
使用哪种方法
在运行时查找 GameObjects 时要小心,因为这可能会消耗资源。特别是:不要在每帧调用一次或多次的方法中运行 FindObjectOfType 或 Find in Update,FixedUpdate 或更多。
- 仅在必要时调用运行时方法
FindObjectOfType
和Find
- 与其他基于字符串的方法相比,
FindGameObjectWithTag
具有非常好的性能。Unity 在标记对象上保留单独的选项卡,并查询那些而不是整个场景。 - 在编辑器创建的静态 GameObjects(诸如 UI 元素和预制件)使用串行化的游戏物体参考在编辑器
- 将自己管理的 ListObjects 列表保存在 List 或 Arrays 中
- 通常,如果你实例化大量相同类型的 GameObject,请查看 Object Pooling
- 缓存搜索结果以避免一次又一次地运行昂贵的搜索方法。
走得更远
除了 Unity 提供的方法之外,设计自己的搜索和收集方法相对容易。
-
如果是
FindObjectsOfType()
,你可以让你的脚本在static
集合中保留自己的列表。迭代准备好的对象列表比从场景中搜索和检查对象要快得多。 -
或者制作一个脚本,将其实例存储在基于
Dictionary
的字符串中,并且你可以扩展一个简单的标记系统。