如何通过空检查确定执行流程操作组件 避免重复调用GetComponent
避免重复调用GetComponent的几种优雅实现方案
方案1:使用Unity内置的TryGetComponent(推荐,适用于Unity 2019.1及以上版本)
这个API是Unity专门为了避免两次调用GetComponent设计的,单次调用即可同时完成「组件存在性判断」和「实例获取」,性能和可读性都最优。
代码示例:
// 判断存在的同时直接把组件实例赋值给out参数 if (someGameObject.TryGetComponent(out FooA myFooA)) { // 直接操作myFooA即可,无需二次获取 // FooA 相关业务逻辑... } if (someGameObject.TryGetComponent(out FooB myFooB)) { // FooB 相关业务逻辑... }
方案2:提前获取组件存为局部变量(适用于Unity 2019之前的老版本)
如果用的Unity版本不支持TryGetComponent,可以先把所有需要判断的组件都取出来存到变量里,再做非空判断,也能避免重复调用GetComponent。
代码示例:
// 先统一获取所有需要判断的组件 FooA myFooA = someGameObject.GetComponent<FooA>(); FooB myFooB = someGameObject.GetComponent<FooB>(); // 直接判断变量是否为空即可 if (myFooA != null) { // FooA 相关业务逻辑... } if (myFooB != null) { // FooB 相关业务逻辑... }
方案3:字典映射处理逻辑(适用于需要判断的组件类型较多的场景)
如果后续需要扩展大量不同组件的处理逻辑,堆大量if判断会让代码臃肿,可维护性差,这种情况可以用「类型+处理委托」的字典做映射,新增类型只需要加一条字典配置即可。
代码示例:
// 提前注册所有组件类型对应的处理逻辑 private readonly Dictionary<Type, Action<Component>> _componentHandlerMap = new Dictionary<Type, Action<Component>>() { { typeof(FooA), comp => { FooA fooA = comp as FooA; // FooA 相关业务逻辑... } }, { typeof(FooB), comp => { FooB fooB = comp as FooB; // FooB 相关业务逻辑... } } }; // 使用时遍历字典匹配处理即可 foreach (var (targetType, handler) in _componentHandlerMap) { if (someGameObject.TryGetComponent(targetType, out var component)) { handler.Invoke(component); // 如果只需匹配第一个符合条件的组件,这里加break即可 } }
内容的提问来源于stack exchange,提问作者rustyBucketBay
相关产品推荐
相关产品推荐

