Unity GameObject 和 Transfrom Find/GetComponent方法区别

171 阅读1分钟

前言

作为一个刚入门的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)底层实现