文章目录
前言
在unity中写脚本时,经常会遇到使用某个GameObject的情况,获取GameObject的方法有很多种,这里介绍几种脚本中查找的方法,下面将分为两类描述:不能找到失活对象的、能找到失活对象的。
一、不能找到失活对象的方法
1.Object类中的静态方法
Object.FindObjectOfType(Type type) //这种方法传Type类型参数,会找到
场上第一个挂在该类型脚本的对象
Object.FindObjectOfType<>() //上述方法的泛型版
Object.FindObjectsOfType(Type type) //找到场上所有挂在该类型脚本的对象,
返回的是一个Object数组
2.GameObject类中的静态方法
GameObject.Find(String name) //通过对象名字查找,若有同名,会
返回场上第一个该名字的对象
GameObject.FindWithTag(string tag) //通过标签查找,在Inspector面板
中设置对象的Tag,同样返回第一个
GameObject.FindGameObjectsWithTag(String tag) //返回场上所有该标签对象
的GameObject数组
二、能找到失活对象的方法
1.Transform.Find()
Transform.Find(string name) //通过Transform的父子关系寻找,
以脚本挂载的对象的transform为
父节点,找到名字为name的子对象
注意,这种方法能找到失活的对象,但只能找到自己的子对象,找不到子对象的子对象,下面介绍一种能找到子对象的子对象的方法
2.如何通过Transform找到自己以下的任意对象
想找到场景上任意失活对象,可以首先找到该对象的根节点,若根节点未失活,就可以通过为Transform类拓展一个方法找到失活对象
代码如下(示例):
public static Transform FindInAll(this Transform transform,string name)
{
Transform target = null;
for (int i = 0; i < transform.childCount; i++)
{
if (transform.GetChild(i).name == name)
{
return transform.GetChild(i);
}
else
{
target = transform.GetChild(i).FindInAll(name);
}
if (target != null) break;
}
return target;
}
注意拓展方法要写在静态类中
总结
要注意,第一栏里的几种方法查找不到场景上失活的对象,而且通过遍历场景上所有的对象的方式去查找,效率较低,性能开销大。而通过Transform查找效率较高,还可以查找到失活的对象,但是只能查找到自身的子对象,所以我们可以通过添加拓展方法实现查找自身以下任意节点的对象。