前言
作为一个刚入门的2D Unity开发者,经常会有在挂了脚本的组件下去寻找子组件的需求,这个时候就会发现GameObject.Find(string name)这个方法最方便用,因为是直接通过GameObject类调用的静态方法,可以找到当前场景中找到的第一个符合条件的GameObject,但这样真的是最优解吗?
Find方法对比
GameObject.Find(string name)
GameObject.Find是静态方法,可以直接通过类名调用。- 它在整个场景中查找具有指定名称的游戏对象,并返回第一个找到的游戏对象。
- 由于它搜索整个场景,所以它的性能开销较大,尤其是当场景中包含大量游戏对象时
- 无法找到InActive的GameObject
Transform.Find(string n)
transform.Find是实例方法,必须通过游戏对象的 Transform 组件调用。- 它在当前游戏对象的子对象中查找具有指定名称的游戏对象,并返回第一个找到的子对象。
- 由于它只搜索当前游戏对象的子对象,所以性能开销较小,通常比
GameObject.Find更高效。 - 可以找到任何状态的子transform,如果是更深层次的子组件,可以使用 Parent/Child 来寻找
GetComponent方法
注:
Transform继承了Component类 transform实例调用的GetComponent都是通过父类Component调用的
常用的GetComponent方法有4种:
- T GetComponent< T >()
GameObject和Transform的调用是一致的
- Component GetComponent(Type type)
都是调用GameObject 的TryGetComponent
- bool TryGetComponent< T >(out T component)
两种方法调用都是调用GameObject 的TryGetComponent
- Component GetComponent(string type)
transform是调用Component中的底层实现
gameObject是调用自己类中的GetComponentByName(strin type)底层实现