unity学习——委托(带参数方法的使用)

本文介绍了一个Unity脚本中的委托使用案例,通过定义委托类型并实现不同方法,展示了如何根据需要选择调用不同的方法来完成打印数值及其两倍的任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是一个只具有打印功能的脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DelegateScript : MonoBehaviour {

   //声明一个委托类型,它的实例引用一个方法
    delegate void MyDelegate(int num);
    MyDelegate myDelegate;
     void Start()
    {
       //委托类型MyDelegate的实例myDelegate引用方法PrintNum
        myDelegate = PrintNum;
        myDelegate(50);
       //委托类型MyDelegate的实例myDelegate引用方法PrintDoubleNum
        myDelegate = PrintDoubleNum;
        myDelegate (50);
    }
    //输出原数
    void PrintNum(int num)
    {
        Debug.Log("Print num:"+num);
    }
    //输出该数的两倍
    void PrintDoubleNum(int num)
    {
        Debug.Log("Double Num:"+num*2);
    }
}

Delegate类定义了两个私有方法PrintNum和PrintDoubleNum,它们分别实现了打印传入的参数和打印传入参数的两倍的功能。在Start方法中,MyDelegate类的实例myDelegate分别引用了这两个方法,并且分别调用了这两个方法。
打印结果如下
这是打印结果

### 使用委托和事件 在 Unity 中,委托和事件提供了一种灵活的方法来进行组件间的解耦通信。下面展示的是如何创建并使用自定义的委托以及基于此构建的事件。 #### 创建委托类型 首先,在脚本内声明一个新的委托类型,这相当于指定了回调函数签名: ```csharp public delegate void MyDelegate(); ``` 该语句表示`MyDelegate`是一种接受零参数且不返回任何值的方法类型的代理[^1]。 #### 定义事件成员变量 接着利用前面定义好的委托来声明一个公共访问权限级别的事件属性: ```csharp public event MyDelegate myEvent; ``` 这里的关键字 `event` 将普通的字段转换成特殊形式——即只允许附加或移除处理程序,而不能直接赋值给它[^4]。 #### 添加处理器至事件 当希望某个特定的行为响应于所发生的事件时,则需向对应的事件注册相应的监听器/处理器。例如可以在`Start()`方法里完成这一过程: ```csharp void Start() { // 订阅事件 myEvent += MyEventHandler; } ``` 上述代码片段意味着每当`myEvent`被激发的时候都会执行一次`MyEventHandler`这个方法。 #### 实现具体的事件处理逻辑 为了使事情发生实际的变化,还需要编写具体要做什么的动作。比如打印一条消息到控制台作为简单示范: ```csharp void MyEventHandler() { Debug.Log("Event handled."); } ``` 一旦关联上了这样的行为之后,只要触发了对应事件就会看到预期的结果输出。 #### 触发事件的发生 最后一步就是考虑何时何地去激活这些已设置完毕的交互关系。通常情况下会在某些条件满足或是接收到外部输入信号之时进行调用: ```csharp void TriggerEvent() { if (myEvent != null) myEvent(); // 调用所有订阅者的处理方法 } ``` 这段话的意思是说如果确实存在至少一位听众的话就依次通知它们有新情况发生了。 综上所述,通过以上几个步骤就可以成功建立起一套基本的工作流,从而让不同部分能够更加高效和谐地协同工作起来。 对于更简洁的方式,可以直接采用内置的泛型委托如`System.Action`代替手动定义新的委托类型,并简化语法如下所示: ```csharp using UnityEngine; public class SimpleDelegateAndEventExample : MonoBehaviour { public event Action simpleEvent; private void OnEnable(){ simpleEvent += () => Debug.Log("Simple Event Handled"); } private void Update(){ if(Input.GetKeyDown(KeyCode.Space)){ simpleEvent?.Invoke(); } } } ``` 在此基础上还可以进一步探索Unity提供的更高层次抽象工具如`UnityEvent`配合Inspector界面编辑可序列化的事件列表等特性[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值