Unity C# Delegate(委托)、Event(事件)、Action和Func的区别和联系

1、Delegate(委托)

实际上是函数容器。

 

缺点:赋予使用者过多权限。比如可以被直接赋值:delegate1 = delegate2;会导致delegate1容器中的函数丢失

2.Event(事件)

更安全的委托。不能被直接赋值(赋值权限变成private),只能在事件类中被触发/被执行。

 

3.Action

返回类型为void委托的简写,c#封装好的一种委托写法。所以特点是用法简洁,但是依旧存在委托的缺点。

等于

4.Function

有返回值委托的简写,返回值不能是void

 

### 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值