动态编程入门第二节:委托与事件 - Unity 开发者的高级回调与通信艺术

动态编程入门第一节:C# 反射 - Unity 开发者的超级工具箱
动态编程入门第二节:委托与事件 - Unity 开发者的高级回调与通信艺术
动态编程入门第三节:表达式树 - 运行时构建代码,释放极致性能!

上次我们聊了 C# 反射,它让程序拥有了在运行时“看清自己”的能力。但光能看清还不够,我们还需要让代码能够灵活地“沟通”和“响应”。这就不得不提到 C# 中另外两个非常重要的概念:委托 (Delegate)事件 (Event)

作为 Unity 开发者,你可能每天都在使用它们,比如 Unity UI 按钮的 OnClick 事件、SendMessageGetComponent<T>().SomeMethod() 等等,它们背后或多或少都离不开委托和事件的思想。今天,我们就来深入探讨它们的进阶用法,以及它们如何构建起 Unity 中高效、解耦的回调和消息系统。


1. 委托(Delegate):方法的“引用”或“签名”

简单来说,委托是一个类型安全的函数指针。它定义了一个方法的签名(包括返回类型和参数列表),可以引用任何符合这个签名的方法。一旦委托引用了一个或多个方法,你就可以通过调用委托来执行这些被引用的方法。

1.1 委托的基础与回顾

你可能已经习惯了使用 Unity 的 UnityEvent 或者直接使用 ActionFunc。它们都是委托的体现。

  • 定义委托:

    // 定义一个委托类型,它能引用一个没有参数,没有返回值的函数
    public delegate void MyActionDelegate();
    
    // 定义一个委托类型,它能引用一个接收一个int参数,返回string的函数
    public delegate string MyFuncDelegate(int value);
    
  • 实例化与调用:

    using UnityEngine;
    
    public class DelegateBasicExample : MonoBehaviour
    {
         
         
        public delegate void MySimpleDelegate(); // 定义委托
    
        void Start()
        {
         
         
            MySimpleDelegate del; // 声明委托变量
    
            // 引用一个方法 (方法签名必须与委托匹配)
            del = SayHello;
            del(); // 调用委托,等同于调用 SayHello()
    
            // 委托可以引用静态方法
            del += SayGoodbye; // += 用于添加方法到委托链 (多播委托)
            del(); // 会依次调用 SayHello() 和 SayGoodbye()
    
            del -= SayHello; // -= 用于从委托链中移除方法
            del(); // 只会调用 SayGoodbye()
        }
    
        void SayHello()
        {
         
         
            Debug.Log("Hello from delegate!");
        }
    
        static void SayGoodbye()
        {
         
         
            Debug.Log("Goodbye from static delegate!");
        }
    }
    
1.2 ActionFunc:泛型委托的便捷性

在 C# 3.0 之后,微软引入了 ActionFunc 这两个内置的泛型委托,极大地简化了委托的定义。

  • Action 用于引用没有返回值的委托。

    • Action:没有参数,没有返回值。
    • Action<T1, T2, ...>:接收 T1, T2… 类型参数,没有返回值。
    • 最多支持 16 个参数。
  • Func 用于引用有返回值的委托。

    • Func<TResult>:没有参数,返回 TResult 类型。
    • Func<T1, T2, ..., TResult>:接收 T1, T2… 类型参数,返回 TResult 类型。
    • 最多支持 16 个参数和 1 个返回值。

示例:

using System; // Action 和 Func 在 System 命名空间
using UnityEngine;

public class ActionFuncExample : MonoBehaviour
{
   
   
    void Start()
    {
   
   
        // Action 示例
        Action greetAction = () => Debug.Log("Hello using Action!");
        greetAction();

        Action<string> printMessage = (msg) => Debug.Log("Message: " + msg);
        printMessage("This is a test.");

        // Func 示例
        Func<int, int, int> addFunc 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吉良吉影NeKoSuKi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值