Unity的寻找物体的几种方法

前言

最近使用FindGameObjectWithTag去查找这个标签的物体使用transform的时候,抛出了一个异常NullReferenceException: Object reference not set to an instance of an object ,但是场景中明明有这个标签的物体,于是准备好好去整理一下这些寻找物体的函数。

  • transform.Find                                                                                                                                                                              此函数是通过名字查找子节点的,性能是寻找算法和查找的数据量有关,所以数据量肯定比GameObject.Find要少,性能一定是比GameObject.Find这种全局寻找的要快,而且可以查找到隐藏的物体,并且当子物体有相同的名字的时候,它查找到一个符合的就会结束,经过测试是从上而下开始查找的(名字相同但是使用材质的名字是不同的,这样就可以进行测试了,可以试一下,transform.Find("Cube").GetComponent<MeshRenderer>().material.name)。
  • GameObject.Find                                                                                                                                                                        此函数是全局通过名字去查找的,这个查找方法十分不推荐使用,是最消耗性能的方法,这个函数不能查找隐藏的物体会返回NULL, 使用递归去遍历整个项目工程去查找合适的名字,找到相同的就会弹栈(黑盒测试出来的,如果不是递归算法希望纠正一下)。
  • GameObject.FindGameObjectWithTag                                                                                                                                         这些有标签的物体应该是存到HashMap这个数据结构里,性能可想而知是O(1),比Find函数性能要高很多,但是这个数据结构还是比较占资源的,这个函数不能查找到隐藏的物体会返回NULL。
  • GameObject.FindGameObjectsWithTag                                                                                                                                      同上FindGameObjectWithTag一样,但是返回的结果是GameObject[]的一个数组,应该是将列表转换成数组进行返回的。
  • GameObject.FindWithTag                                                                                                                                                            这个其实是调用了FindGameObjectWithTag ,网上查阅到的有大佬进行反编译看到源代码如图下:

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值