Unity查找物体方法的详细对比
我们开发中常用的查找物体的方法有:GameObject.Find()、transform.Find()、FindGameObjectWithTag()、FindGameObjectsWithTag()、FindObjectOfType()、FindObjectsOfType()、transform.GetChild()、Resources.FindObjectsOfTypeAll。这几种方法各有优缺点,本文会详细进行解释以便于我们在开发应用中需要根据具体情况进行选择(几种方法应用的时候需要的注意区分大小写)。
1.GameObject.Find():
优点:这种方法应用比较方便,可以直接在Hierarchy窗口有物体中查找指定名称的物体,返回第一个没有被隐藏的物体;不用担心重名问题。
缺点:如果对应名称的物体被隐藏了,会出现空引用报错。并且此方法是对全局进行查找比较消耗性能
2.transform.Find():
优点:这种方法可以直接查找根节点在Hierarchy窗口中子物体,可以查找被隐藏的物体,受限比较小
缺点:根节点不能被隐藏,书写不方便,要写入完成路径
3.transform.GetChild():
优点:这种方法可以直接查找根节点在Hierarchy窗口中指定索引的物体,可以查找被隐藏的物体,根节点也可以隐藏,受限更小较小,相比transform.Find()书写,在查找层级比较少的情况下写代码也方便
缺点:在后续的开发中如果改变子物体的顺序会导致查找错误
4.FindGameObjectWithTag和FindGameObjectsWithTag:
对比:FindGameObjectWithTag从上往下查找对应标签的第一个物体,FindGameObjectsWithTag返回一个数组,所有该标签的物体都在那其中(没有被隐藏的)
优点:该方法是通过标签查找,在物体数量比较多层级比较深的情况比较好用
缺点:比较麻烦需要对物体设置标签,如果想要获得某一个该标签的物体的时候,不是很好用;不能查找被隐藏的物体
5.FindObjectsOfType和FindObjectsOfType:
对比:FindObjectOfType从上往下查找含有对应组件的第一个物体,FindObjectsOfType返回一个数组
优点:不需要知道物体的名称或者索引,返回与该类型匹配的对象,
缺点:该函数的运行速度非常缓慢。不建议对每一帧都使用该函数。 在大多数情况下,您可以改为使用单例模式。不能查找隐藏的物体
6.Resources.FindObjectsOfTypeAll:
优点:可以在整个Hierarchy窗口中查找所有物体,特指所有物体,无论有没有被隐藏。通常用在编辑器脚本中
缺点:性能开销比较大