文章目录

  • 前言
  • 一、不能找到失活对象的方法
  • 1.Object类中的静态方法
  • 2.GameObject类中的静态方法
  • 二、能找到失活对象的方法
  • 1.Transform.Find()
  • 2.如何通过Transform找到自己以下的任意对象
  • 总结



前言

在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查找效率较高,还可以查找到失活的对象,但是只能查找到自身的子对象,所以我们可以通过添加拓展方法实现查找自身以下任意节点的对象。