Unity---委托与事件

这篇具有很好参考价值的文章主要介绍了Unity---委托与事件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.委托和事件在使用上的区别是什么?

2. delegate委托

2.1示意图

2.2 DelegetTest.cs

2.3 Deleget_A.cs

2.4 Deleget_B.cs

2.5 运行unity. 点击按键 A

 2.6 点击按键 B

 3.Event 事件

3.1单个通知

3.1.1示意图

 3.1.2 Event_Test.cs

3.1.3 Event_A.cs

3.1.4 运行 点击按键A

 3.2多个通知

3.2.1示意图

 3.2.2 Event_Test.cs

3.2.3 Event_A.cs

3.2.4 Event_B.cs

3.2.5 运行 点击按键A


1.委托和事件在使用上的区别是什么?


委托和事件是C#中的重要概念,通俗来讲,委托是一个可以指向特定方法的指针,可以将委托分配给不同的脚本,使它们能够完成不同的任务。而事件则是一种使用委托实现的通知机制,它告诉委托需要执行任务了。因此,委托定义了任务,而事件则是通知委托执行任务的通知。在 Unity 中,通过使用委托和事件,可以实现诸如响应按钮点击,处理游戏碰撞等功能。

它们在使用上的不同:
定义:委托是一种类型,它可以引用方法。事件是一种基于委托的机制,允许在事件发生时通知多个对象。

用法:委托是一种低级机制,可以直接调用关联的方法。事件则是一种高级机制,它可以被订阅和取消订阅,并在事件发生时引发通知。

安全性:委托是一种不安全的机制,它允许直接访问关联的方法,这可能会导致错误。事件则是一种安全的机制,它只允许通过订阅和取消订阅来访问关联的方法,因此不存在安全风险。

总之,委托是C#中的一种低级机制,它可以直接调用关联的方法,但可能带来安全问题;事件则是一种高级机制,它是基于委托的,允许在事件发生时通知多个对象,并且更加安全。

2. delegate委托

2.1示意图

层级面板:

Unity---委托与事件

属性面板:

 Unity---委托与事件

 Unity---委托与事件

 Unity---委托与事件

 如图,三个脚本分别挂载到三个物体上

2.2 DelegetTest.cs

using UnityEngine;

public delegate void Call(string type);

public class DelegetTest : MonoBehaviour
{
    public static Call call;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            call("a");
        }
        if (Input.GetKeyDown(KeyCode.B))
        {
            call("b");
        }
    }
}

2.3 Deleget_A.cs

using UnityEngine;

public class Deleget_A : MonoBehaviour
{
    private string type = "a";

    private void Awake()
    {
        DelegetTest.call += BeCalled;
    }

    private void BeCalled(string msg)
    {
        Debug.LogError(type + "接收到呼叫");

        if (msg.Equals(type))
        {
            Debug.LogError("a 开始做事");
        }
    }
}

2.4 Deleget_B.cs

using UnityEngine;

public class Deleget_B : MonoBehaviour
{
    private string type = "b";

    private void Awake()
    {
        DelegetTest.call += BeCalled;
    }

    private void BeCalled(string msg)
    {
        Debug.LogError(type + "接收到呼叫");
        if (msg.Equals(type))
        {
            Debug.LogError("b 开始做事");
        }
    }
}

2.5 运行unity. 点击按键 A

Unity---委托与事件

 2.6 点击按键 B

Unity---委托与事件

 3.Event 事件

3.1单个通知

3.1.1示意图

层级面板:

 Unity---委托与事件

 属性面板:

Unity---委托与事件

 Unity---委托与事件

 3.1.2 Event_Test.cs

public class Event_Test : MonoBehaviour
{
    public event EventHandler<Event_A> eventCall;

    [SerializeField]
    private Event_A eventA;

    private void Awake()
    {
        eventCall += Call;
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            eventCall.Invoke(this, eventA);
        }
    }

    private void Call(object obj, Event_A e_a)
    {
        Debug.LogError(e_a.args);
        e_a.DoSomething();
    }

}

3.1.3 Event_A.cs

using UnityEngine;

public class Event_A : MonoBehaviour
{
    public string args = "我是脚本A";

    public void DoSomething()
    {
        Debug.LogError("脚本A在做事");
    }
}

3.1.4 运行 点击按键A

Unity---委托与事件

 3.2多个通知

3.2.1示意图

层级面板:

Unity---委托与事件

 属性面板:

Unity---委托与事件

 Unity---委托与事件

 Unity---委托与事件

 3.2.2 Event_Test.cs

using System;
using UnityEngine;

public class Event_Test : MonoBehaviour
{
    public event EventHandler eventCall;

    [SerializeField]
    private Event_A eventA;
    [SerializeField]
    private Event_B eventB;

    private void Awake()
    {
        eventCall += eventA.Call;
        eventCall += eventB.Call;
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            eventCall.Invoke(this, EventArgs.Empty);
        }
    }
}

3.2.3 Event_A.cs

using System;
using UnityEngine;

public class Event_A : MonoBehaviour
{
    public string _name = "aaa";

    public void DoSomething()
    {
        Debug.LogError("脚本A开始做事");
    }

    public void Call(object obj, EventArgs args)
    {
        Debug.LogError(_name);
        DoSomething();
    }
}

3.2.4 Event_B.cs

using System;
using UnityEngine;

public class Event_B : MonoBehaviour
{
    public string _name = "bbb";

    public void DoSomething()
    {
        Debug.LogError("脚本B开始做事");
    }

    public void Call(object obj, EventArgs args)
    {
        Debug.LogError(_name);
        DoSomething();
    }
}

3.2.5 运行 点击按键A

Unity---委托与事件

 文章来源地址https://www.toymoban.com/news/detail-470284.html

到了这里,关于Unity---委托与事件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c# 事件与委托

    //在C#中, 事件是一种特殊的委托 ,它允许对象通知其他对象发生了某个特定的事件。 //事件通常用于GUI应用程序中,例如当用户单击按钮时,按钮控件会引发Click事件, //然后其他对象可以订阅该事件并执行相应的操作。 //以下是一个简单的示例,演示如何在C#中使用事件和

    2024年02月06日
    浏览(42)
  • 委托与事件(一)——C#版本

      委托是对 函数的封装 ,可以当作给方法的特征指定一个名称。而事件则是 委托的一种特殊形式 ,当发生有意义的事情时,事件对象处理通知过程。   委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有 完全相同的行为 。   用例子来说明为

    2023年04月09日
    浏览(46)
  • C#委托和事件简单复习

    太久没用了,简单的复习一下 快速过一遍语法使用 1.定义一个委托类型 只需要在声明的前面加上delegate,其他的就跟声明一个方法(函数)类似 2.使用刚刚声明的委托 需要定义一个返回值跟参数与我们刚刚定义的委托一致 3.然后声明一个SayHello类型(委托)的变量 把

    2024年02月14日
    浏览(46)
  • C#学习笔记8:接口、委托、事件

    今日继续我的C#学习之路,今日学习接口、委托、事件,文章从实践出发学习这三个设计理念,并提供完整源码 目录 1、接口(多重继承): 代码: 运行结果: 2、委托(方法的代理/函数指针): 创建控制台程序实现委托: 遇到的报错及解决: 修改后的代码: 运行结果: 3、

    2024年04月15日
    浏览(55)
  • C#学习,委托,事件,泛型,匿名方法

    目录 委托 声明委托 实例化委托 委托的多播 委托的用途 事件 通过事件使用委托 声明事件 泛型 泛型的特性 泛型方法 泛型的委托 匿名方法 编写匿名方法的语法 类似于指针,委托是存有对某个方法的引用的一种引用类型变量,引用可以在运行时被改变。特别用于实现事件和

    2024年02月12日
    浏览(46)
  • C# 中的委托和事件机制

    在C#中,委托和事件是非常重要的概念,用于实现程序中的回调和事件处理。在这里,我们将介绍C#中委托和事件机制的基础知识和用法。 委托是一种类似于C/C++函数指针的概念,它允许将方法作为参数传递到其他方法中,以实现回调函数的功能。委托是一种类型,它可以表示

    2023年04月21日
    浏览(37)
  • C# 事件和委托的区别并说明

    事件是基于委托的,为委托提供了一个发布/订阅机制。可以说事件是一种特殊的委托,他的调用和委托是一样的。 事件的声明 public event 委托类型 事件名称 通常事件的命名以事件名称+Event来命名。如public event delegate NotifyEvent; 事件和委托的区别如下: 事件只能在方法的外部

    2024年02月07日
    浏览(40)
  • C# 一个完整的委托、事件学习示例

    该示例符合委托、事件的定义规则,并且可以帮助大家更好地理解委托和事件的使用! 先定义了一个名为 MyEventArgs 的类,继承自 EventArgs ,它包含一个 Message 属性,用于存储传递的消息。 Publisher 类中添加了一个 protected virtual 的方法 OnMyEvent ,用于触发 MyEvent 事件,并传递

    2024年02月07日
    浏览(42)
  • 【C# Programming】委托和lambda表达式、事件

    目录 一、委托和lambda表达式 1.1 委托概述 1.2 委托类型的声明 1.3 委托的实例化 1.4 委托的内部机制  1.5 Lambda 表达式 1.6 语句lambda 1.7 表达式lambda 1.8 Lambda表达式 1.9 通用的委托 1.10 委托没有结构相等性 1.11 Lambda表达式和匿名方法的内部机制 1.12 外部变量 1.13 外部变量的

    2024年02月06日
    浏览(46)
  • C#中的委托(Delegate)和事件 (Event)详解与使用范例

    最近天气晴雨不定,你因为害怕打游戏时忘记在下雨时收衣服或者在天晴时把衣服挂出去,于是你委托好友小明在天气发生变化时打电话通知你,这就是一种委托. 下面是这种委托的实例代码 以上代码的输出为 值得一提的是,如下代码为创建一个继承自Delegate类的名为XiaoMing的子类

    2023年04月12日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包