我们在unity中新建一个场景,我们定义10个需要查找的样例名字和Tag标签都分别为"Target0"-“Target9”,然后将其放在30层深度的路径下,来分别测试一下查找方式的性能
GameObject.Find(string name) 通过名字查找
GameObject.Find(string path) 通过完整路径查找
Transform.Find(string path) 通过完整路径查找
Transform.GetChild(int index) 通过子物体位置索引
GameObject.FindGameObjectWithTag(string tag) 通过Tag标签查找
测试结果:
由上述结果可知,当 GameObject.Find(string name) 满足查询条件时,即可确保其能查到目标物体时候,应该推荐使用该方式,不推荐使用不是因为查找效率不高,而是查找限制大,没有Transform.Find(string path)能确保查到目标.
还有部分开发者说查找时候要提供完整的路径比根据名字便利查找效率更高,但是上述测试结果与此结论天壤之别,可能的原因是Unity并没有为每一个GameObject物体存储完整的索引,激活的物体应该是直接存储名字提供查找,所以提供完整的路径查找对于GameObject.Find这种方式不推荐使用!!!通过完整路径查找应该使用Transform.Find(string path)查找,虽然它的效率在以上几种查找方式里看起来不是最高的,但是它查找受到的限制较小,例如不用担心在游戏逻辑中隐藏了物体而导致使用GameObject.Find查找不到的问题
所以说要做到性能最佳的查找应该将GameObject.Find(string name)和Transform.Find(string path)和Transform.GetChild(int index) 和GameObject.FindGameObjectWithTag(string tag)几种方式根据需求相结合
1.当GameObject.Find(string name) 查找条件不受限制时,用GameObject.Find
2.当查找数量不多,且需要包含隐藏物体时,各子物体索引位置可能会发生变化时,用Transform.Find(string path)
3.当查找数量不多,且需要包含隐藏物体时,各子物体索引能确保不变时,Transform.GetChild(int index) 效率更高
4.当路径过长过深时,且目标物体数量较多成组时,可以为其设置Tag然后FindGameObjectsWithTag查找
Unity查找效率对比
最新推荐文章于 2024-04-07 12:37:40 发布