1. 对象.Find()
Object.Find():按名称查找游戏对象并返回它。
void ObjectFind() { // 找父级 GameObject parent = GameObject.Find("GameObject"); Debug.Log("找父级物体,是否找到:" + (parent != null)); // 找子级 GameObject child = GameObject.Find("Child"); Debug.Log("找子级物体,是否找到:" + (child != null)); // 找父级隐藏物体 GameObject parentHide = GameObject.Find("GameObjectHide"); Debug.Log("找父级隐藏物体,是否找到:" + (parentHide != null)); // 找子级隐藏物体 GameObject childHide = GameObject.Find("ChildHide"); Debug.Log("找子级隐藏物体,是否找到:" + (childHide != null)); }
测试结果如下:
当使用 GameObject.Find("GameObject") 并且场景中有多个名为“GameObject”的对象时游戏运营,将每个“GameObject”设置为不同的标签并运行多次以检查结果。
测试场景如下:
测试代码如下:
// 找同名物体 GameObject nameObj = GameObject.Find("GameObject"); Debug.Log("找同名,是否找到:" + nameObj.tag);
测试结果:搜索顺序为:“self”(脚本挂载的对象)-->自身同级之上的对象-->自身同级之下的对象-->自己的子对象-- > 它自己的父对象。
Object.Find() 得出结论:
全局搜索参数名称游戏对象; 禁用(隐藏)的对象将不会被搜索; 如果存在同名对象,则按照层次关系进行查找。
使用建议:当存在同名对象时,尽量不要使用Object.Find()进行搜索,或者在使用Object.Find()进行搜索时,应控制搜索对象的名称唯一。
2.FindGameObjectWithTag()
GameObject.FindGameObjectWithTag() 根据标签查找游戏对象并返回。
GameObject.FindGameObjectsWithTag() 根据标签查找当前场景中所有带有该标签的游戏对象,并返回所有对象的数组。
以下场景:将除主摄像机外的所有游戏对象的标签更改为Player进行测试。
测试代码如下:
void GameObjectFindWithTag() { GameObject tagObj = GameObject.FindGameObjectWithTag("MainCamera"); Debug.Log("根据标签查找游戏物体,是否查到:" + (tagObj != null)); GameObject[] tagObjs = GameObject.FindGameObjectsWithTag("Player"); for (int i = 0; i < tagObjs.Length; i++) { Debug.Log("根据标签查找游戏物体名称:" + tagObjs[i].name); } }
检测结果:
查找不存在的标签测试:
GameObject tagObj = GameObject.FindGameObjectWithTag("MainCamera1"); Debug.Log("根据标签查找游戏物体,是否查到:" + (tagObj != null));
错误:UnityException:标签:MainCamera1 未定义。 翻译:MainCamera1 是一个未定义的标签
FindGameObjectWithTag() 得出结论:
3. GameObject.FindObjectOfType()
和上面根据标签进行搜索的逻辑类似。
GameObject.FindObjectOfType(); :根据类型(组件/自定义脚本)查找并返回此类。
GameObject.FindObjectsOfType():根据类型(组件/自定义脚本)查找当前场景中所有该类,并返回该类的数组。
void FindObjectOfType() { Camera typeCamera = GameObject.FindObjectOfType(); Debug.Log("根据类型查找物体,是否查到:" + (typeCamera != null)); Transform[] typeTransArr = GameObject.FindObjectsOfType (); for (int i = 0; i < typeTransArr.Length; i++) { Debug.Log("根据类型查找到的物体名称:" + typeTransArr[i].name); } }
FindObjectOfType() 得出结论:
常见用例是:在初始化期间获取一个脚本中对另一个脚本的引用unity 找到子物体,并以此形式进行搜索。 【后来大多被单例取代】
4. 变换.Find()
查找已安装对象的父对象、同级对象和子对象:
void TransformFind() { // 找父级 Transform parent = transform.Find("Root"); Debug.Log("找父级物体,是否找到:" + (parent != null)); // 找同级 Transform selfObj = transform.Find("Parent_1"); Debug.Log("找同级物体,是否找到:" + (selfObj != null)); // 找子级 Transform child = transform.Find("Child"); Debug.Log("找子级物体,是否找到:" + (child != null)); // 找子级隐藏物体 Transform childHide = transform.Find("ChildHide"); Debug.Log("找子级隐藏物体,是否找到:" + (childHide != null)); }
查找多级子对象:
// 找二级子物体 Transform child_1 = transform.Find("Child_1_1"); Debug.Log("找二级子物体 参数只写名称,是否找到:" + (child_1 != null)); // 找二级子物体 Transform child_1_1 = transform.Find("Child/Child_1_1"); Debug.Log("找二级子物体 参数写全路径,是否找到:" + (child_1_1 != null));
Find() 的结论是:
5. Transform.FindObjectOfType()
经过测试,它和GameObject.FindObjectOfType()没有任何区别。 测试结果一致。 测试代码和截图不占空间。
在测试过程中,我发现 GameObject.FindObjectsOfType() 和 Transform.FindObjectsOfType() 被合并了。 应该说,它们是完全一样的方法。 从下图中可以看到,虽然我之前输入了Transform标签unity 找到子物体,但是它是灰色的。 当您将鼠标放在它上面时,您会看到方法引用是 GameObject.FindObjectsOfType。
得到结论:
Transform.FindObjectOfType() 和 GameObject.FindObjectOfType() 的使用方式相同,结果没有什么不同...
6. 变换.GetChild()
Transform.GetChild()是一种查找子对象的方法,也是我个人比较喜欢使用的方法。 缺点是游戏对象的层级关系不能随意修改。
使用起来也非常简单
例如:查找第一级子对象的第一个对象
Transform child1 = transform.GetChild(0);
查找第一级子对象的第一个对象的第三个子对象
Transform child1 = transform.GetChild(0).GetChild(2);
使用方法:GetChild()为多个级别,参数为当前级别的对象(从0开始)
使用扩展:
遍历子对象:
for (int i = 0; i < transform.childCount; i++) { Debug.Log(transform.transform); }
获取当前对象的父对象transform.parent
获取当前对象的根对象transform.root
Transform.GetChild() 用法总结:
总结
关于在 Unity 中查找游戏对象的六种方法的文章到此结束。 更多关于在Unity中查找游戏对象的信息硬件设备,请搜索Script House之前的文章或者继续浏览下面的相关文章。 希望大家以后多多支持脚本。 到家了!