这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战数组
一篇小白也能看懂的查找游戏物体的方式解析 -- Unity 之 查找物体的几种方式(一)。本文经过实际测试得出使用结论,你们进行简单记录,在使用时想不起来能够再来看看,多用几回基本就没有问题了。markdown
Object.Find()
:根据名称找到游戏对象并返回它。ide
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));
}
复制代码
测试结果以下图: post
当有使用GameObject.Find("GameObject")
, 场景中有多个名为“GameObject”的物体存在时,将每一个“GameObject”设置为不一样的标签,多运行几回查看结果。测试
测试场景以下: ui
测试代码以下:spa
// 找同名物体
GameObject nameObj = GameObject.Find("GameObject");
Debug.Log("找同名,是否找到:" + nameObj.tag);
复制代码
测试结果: 查找顺序是:“自身”(挂载脚本的物体) --> 和自身同层级上面物体 --> 和自身同层级下面物体 --> 自身子物体 --> 自身父物体。翻译
Object.Find()得出结论:3d
使用建议: 有同名物体存在时,尽可能不要使用Object.Find()
进行查找,或者说使用Object.Find()
进行查找时,应控制查找物体命名惟一。code
GameObject.FindGameObjectWithTag()
根据标签查找游戏物体并返回。 GameObject.FindGameObjectsWithTag()
根据标签查找当前场景中全部这个标签的游戏物体并返回全部物体的数组。
将以下场景:除主摄像机~(Main Camera)外的全部游戏物体的标签(Tag)~都修改成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: Tag: MainCamera1 is not defined.
翻译: MainCamera1是一个未定义的标签
FindGameObjectWithTag()得出结论:
FindGameObjectWithTag
此方式查找单一游戏体,由于查找顺序会受到层级影响;和上面根据标签查找的逻辑差很少。
GameObject.FindObjectOfType<类型>();
:根据类型(组件/自定义脚本)查找并返回这个类。 GameObject.FindObjectsOfType<类型>()
:根据类型(组件/自定义脚本)查找当前场景中全部这个类并返回一个这个类的数组。
void FindObjectOfType()
{
Camera typeCamera = GameObject.FindObjectOfType<Camera>();
Debug.Log("根据类型查找物体,是否查到:" + (typeCamera != null));
Transform[] typeTransArr = GameObject.FindObjectsOfType<Transform>();
for (int i = 0; i < typeTransArr.Length; i++)
{
Debug.Log("根据类型查找到的物体名称:" + typeTransArr[i].name);
}
}
复制代码
FindObjectOfType()得出结论:
一般使用状况为:初始化时在一个脚本中获取另外一个脚本的引用,经过这种形式查找。【后多被单例取代】
好了本文就介绍这里了,感谢你观看至此。若对你有所帮助,但愿能够三连支持下。若你还相关问题没有获得解决或者更好的处理方案,也但愿你留言评论。
Unity基础 之 查找游戏物体的几种方式解析(二):juejin.cn/editor/draf…