Unity查找物体的方法总结


前言

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值