近日研究了一下Unity的基本查找物体的方法,发现网上坑还是挺多的
无论是哪种方法,为了性能的考虑,请不要将获取物体的代码写在Update里
注意:
请注意GameObject和gameObject的区别
请注意Transform和transform的区别
查找物体的6种方法 | 方法 | 优点 | 缺点 | ||
GameObject (Unity的所有物体的基类,针对全局,方法是静态方法,所以可以直接用) 注意:非gameObject,注意大小写,gameObject指的是该物体,gameObject无这些方法 | GameObject.Find(物体名字) | 递归遍历全局物体,直到找到 第一个 为Capsule的物体 | 全局搜索 | 1.无法查找隐藏对象 2.效率低下(相当于递归遍历查找) | |
GameObject.Find("GameObject/ChildGameObject); | 通过路径查找 | 1:解决查找中可能出现的重名问题。 2:如果有完全的路径,减少查找范围,减少查找时间。 | 1.路径或结构调整后,需要重新调整路径字段。 2.如果路径查找中的任何一个父节点被隐藏(Active=false),这个对象都将查找不到。 | ||
GameObject.FindWithTag(Tag字段)/FindGameObjectsWithTag(Tag字段) | 全局找到 (第一个)/(所有) Tag为Capsule的物体 | tag的搜索速度比Find来的快 | |||
transform (是本物体的transform的组件,所以查找都是针对本物体的) 注意:非Transform,注意大小写,Transform指的是Transform类型,Transform无这些方法 | transform.Find(物体名字) | 找到该脚本挂的物体的 第一个 为Capsule的孩子(本质为路径查找) | 1.可以查找隐藏对象 2.支持路径查找 3.查找隐藏对象的前提是transform所在的根节点必须可见(active=true) | 1.局部查找 2.不能直接找到平级的物体及他们的孩子 | 效率比GameObject高,强烈建议使用 |
transform.GetChild(Index) | 找到该脚本挂的物体的 第一个孩子 | 效率高 | 1.局部查找 | ||
Resources.FindObjectsOfTypeAll () | 返回指定类型的对象列表(如XXXScript)。主要用于编辑器中,eg。检测内存泄露、批量查找的功能等 | 用的少,几乎不用 | 用得少,几乎不用 |