Unity C# 的delegate委托事件Action,Func

1.什么是delegate委托:

  1. 定义:委托是一种引用类型,它存储了对某个方法的引用。通过这个引用,可以在运行时动态地调用该方法。
  2. 声明:委托的声明语法类似于方法的声明,但需要加上delegate
    public delegate void MyDelegate(int i);
    public MyDelegate myDelegate  ;
    public void Start()
    {
    	//委托delegate
    	myDelegate  = new MyDelegate(DoThing);
    	myDelegate = DoThing;//等号赋值,更改委托内容
    	myDelegate += DoThing;    // 注册事件
    	myDelegate -= DoThing;    // 取消注册事件
    	myDelegate.Invoke(1);    // 通知注册了delegate的对象
    }
    
    public void DoThing(int i)
    {
    	Debug.Log(i);
    }
    

2.特性与用途

  1. 类型安全:委托是类型安全的,它确保了只有与委托签名相匹配的方法才能被关联到委托实例上。
  2. 多播:一个委托实例可以关联多个方法,这称为多播委托。当调用多播委托时,它将依次调用所有关联的方法。这可以通过使用+=运算符向委托添加方法,以及使用-=运算符从委托中移除方法来实现。
  3. 事件和回调:委托特别用于实现事件和回调方法。事件是委托的一种特殊应用,它允许对象在发生特定事件时通知其他对象。回调方法则是在某个操作完成后被调用的方法。
  4. 封装对象实例和方法:委托不仅封装了方法,还
### UnityC# 委托与事件的用法及实现 #### 1. 基础概念 在 C#Unity 开发中,委托(Delegates)是一种类型安全的函数指针[^3]。它允许将方法作为参数传递给其他方法,并支持动态调用和多播特性。Unity 提供了一些特定于引擎的委托类型,如 `UnityAction`。 - **C# 自带的委托** - `Action`: 表示无返回值的方法[^1]。 - `Func<T>`: 表示有返回值的方法。 - **Unity 自带的委托** - `UnityAction`: 是一种特殊的委托类型,用于简化事件处理逻辑。 - Unity 并未提供类似于 `Func` 的内置委托类型。 #### 2. 绑定与调用方式 通过 Lambda 表达式可以更简洁地定义和绑定委托[^2]。例如: ```csharp // 定义并使用 Action 委托 System.Action<string> myDelegate = message => Console.WriteLine(message); myDelegate("Hello, Delegate!"); ``` 对于复杂场景,可以直接指定方法名或使用匿名方法来绑定委托。 #### 3. Unity 中的事件系统 Unity 支持两种类型的事件:标准 C# 事件 (`event`) 和 Unity 特有的 `UnityEvent`[^4]。 ##### (1)C# 自带的事件 C# 事件基于委托实现,通常用于解耦对象之间的交互关系。以下是基本用法: ```csharp public class ButtonManager { public event System.Action OnButtonClick; public void SimulateButtonPress() { OnButtonClick?.Invoke(); // 调用所有订阅者 } } class Program { static void Main(string[] args) { var manager = new ButtonManager(); manager.OnButtonClick += () => Console.WriteLine("Button Pressed!"); manager.SimulateButtonPress(); } } ``` ##### (2)UnityEvent 的使用 `UnityEvent` 更适合 Unity 编辑器环境下的可视化操作。它可以绑定到脚本中的方法或者编辑器内的组件行为。 ```csharp using UnityEngine; using UnityEngine.Events; public class Example : MonoBehaviour { public UnityEvent onTriggerEnter; // 可视化绑定事件 private void OnTriggerEnter(Collider other) { onTriggerEnter.Invoke(); // 执行所有绑定的操作 } } ``` #### 4. 最佳实践建议 - **优先使用预定义委托**: 如 `Action` 或 `Func`,减少自定义委托带来的额外开销。 - **合理管理内存**: 避免因忘记解除事件绑定而导致的对象泄漏问题。 - **利用多播特性**: 当需要通知多个监听者时,充分利用委托的多播能力。 - **结合 Lambda 表达式优化代码结构**: 对简单回调采用 Lambda 表达式以提升可读性。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

垂葛酒肝汤

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

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

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

打赏作者

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

抵扣说明:

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

余额充值