Unity C#如何在自定义Action类中将函数作为属性存储调用
具体实现方案
首先注意C# System 命名空间下已经内置了Action委托类型,你的自定义类如果命名为Action会出现命名冲突,建议先将自定义类重命名为GameAction避免编译问题,完整实现如下:
using UnityEngine; using System; // 必须引入System命名空间才能使用内置委托 public class GameAction : MonoBehaviour { public int ID; public string Name; // 定义存储无参无返回方法的委托属性 public Action Test; }
方法绑定写法:
void TestFunction() { print("Test"); } public GameAction ExampleAction; // 绑定方法时直接传方法名,不要加括号 ExampleAction.Test = TestFunction;
触发调用写法:
// 用?.Invoke()做非空判断,避免未绑定时触发空引用异常 ExampleAction.Test?.Invoke();
常见问题说明
- 你原写法
ExampleAction.Test = TestFunction();存在错误:加括号会直接执行TestFunction方法,尝试将方法返回值赋值给委托属性,而你的方法无返回值,会直接编译失败,正确写法是不带括号直接传入方法名作为引用。 - 如果需要单个动作绑定多段逻辑,可以使用委托多播特性,绑定时用
+=添加方法,解绑时用-=移除方法,调用时会按绑定顺序执行所有方法。
可靠性与方案评估
- 可靠性:委托是C#原生语法,全平台Unity项目都稳定支持,不存在兼容性问题,运行开销可以忽略不计,是非常可靠的实现方式。
- 方案合理性:你的场景是大量动态切换的动作逻辑,委托本身就是为「将方法作为变量存储、动态绑定调用」的场景设计的,是当前场景的最优解决方案。如果后续需要支持带参数的动作,直接替换为泛型委托
Action<T1, T2...>即可,拓展性极强。 - 注意事项:在对象销毁、动作切换时及时用
-=移除不需要的绑定,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Carcanken
相关产品推荐
相关产品推荐

