Action- C# 内置的委托类型

总结

  1. Action = C# 无返回值委托 ,Unity 中用来做事件 / 回调
  2. 声明:Action、Action<T>、Action<T1,T2>
  3. 调用:action?.Invoke();
  4. 注册:action += 方法;
  5. 作用:解耦代码、跨脚本通信

一、Action 到底是什么?

  1. 本质 :System.Action 是 C# 官方封装好的 无返回值委托(delegate)
  2. 作用:存储 ** 没有返回值(void)** 的方法,可以像变量一样传递、调用
  3. 分类 :
    • Action:无参数、无返回值
    • Action<T>:1 个参数、无返回值
    • Action<T1,T2>:2 个参数、无返回值
    • 最多支持 16 个参数

简单记:Action = 可以存方法的变量,只能存 void 方法

二、 Action 在 Unity 中的声明方式

1. 最基础:无参数 Action

cs 复制代码
// 声明一个 Action 变量
public Action OnPlay;

// 声明私有 Action
private Action OnGameOver;

2. 带参数 Action(最常用)

cs 复制代码
// 1个参数:int 类型
public Action<int> OnScoreChange;

// 2个参数:string + bool
public Action<string, bool> OnUIMessage;

// 3个参数(以此类推)
public Action<int, float, string> OnSkillCast;

3. 静态 Action(全局事件,跨脚本调用)

cs 复制代码
// 全局广播:玩家受伤
public static Action<float> OnPlayerHurt;

4.只读 / 只能外部订阅、内部调用

cs 复制代码
// 外部只能 += 注册,不能直接 = 赋值,更安全
public Action OnDie { get; private set; }

三、Action 完整使用示例(Unity 可直接运行)

示例 1:无参数 Action(按钮点击 / 技能释放)

cs 复制代码
using UnityEngine;
using System;

public class Player : MonoBehaviour
{
    // 1. 声明 Action
    public Action OnJump;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // 2. 调用 Action(触发所有注册的方法)
            OnJump?.Invoke();
        }
    }
}

另一个脚本订阅:

cs 复制代码
public class UIManager : MonoBehaviour
{
    void Start()
    {
        // 注册方法到 Action
        FindObjectOfType<Player>().OnJump += ShowJumpEffect;
    }

    void ShowJumpEffect()
    {
        Debug.Log("播放跳跃特效!");
    }
}

示例 2:带参数 Action(扣血、得分)

cs 复制代码
public class Enemy : MonoBehaviour
{
    // 声明带 int 参数的 Action
    public Action<int> OnTakeDamage;

    void Hit()
    {
        // 调用并传参
        OnTakeDamage?.Invoke(50);
    }
}

订阅:

cs 复制代码
// 接收参数
enemy.OnTakeDamage += (damage) =>
{
    Debug.Log("受到伤害:" + damage);
};

四、关键语法说明

1. ?.Invoke() 必须加!

cs 复制代码
// 安全调用:如果 Action 为空(没注册方法),不会报错
OnJump?.Invoke();

不加 ?. 会报 空引用异常 ,Unity 中必须写。

2. 注册与注销

cs 复制代码
// 注册
OnJump += MyMethod;

// 注销(重要!避免内存泄漏)
OnJump -= MyMethod;

五、Action 与 普通委托 的区别

你也可以自己声明委托,效果一样:

cs 复制代码
// 自定义委托(等价于 Action)
public delegate void MyDelegate();
public MyDelegate OnEvent;

六、Action 适用场景(Unity 高频使用)

  • UI 按钮点击回调
  • 玩家受伤、死亡、升级事件
  • 任务完成、道具拾取通知
  • 技能释放、冷却完成
  • 全局消息广播(跨脚本通信)
  • 异步加载完成回调
相关推荐
步行cgn9 小时前
Spring MVC 拦截器 Interceptor 详解:从执行流程到实战应用
java·spring·mvc
文丑颜不良啊9 小时前
LeetCode1381~1400题目解析
java·leetcode
开开心心_Every9 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
chenbingjie_c9 小时前
C++ 多态完全指南:从虚函数重写到虚函数表原理
开发语言·c++
吴卫斌9 小时前
定投ETF实战指南(四):行业/主题ETF——定投的“进攻端“
开发语言·python·股票·量化
萧瑟余晖10 小时前
Spring Batch核心模型与快速上手详解
java·spring·batch
缓慢更新10 小时前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
超级架构师10 小时前
PRAXO-CORE 2.5.0:用 conformance 和显式边界构建 Go Agent 框架
开发语言·人工智能·后端·golang·ai编程·智能体框架·praxo-core
叼烟扛炮11 小时前
Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程
linux·开发语言·网络·笔记·tcp/ip
LMT流氓兔12 小时前
第五单元——第十六课:给书店助手加上网页界面
java·开发语言·jvm·人工智能·oracle·langchain·1024程序员节