【SKFramework框架核心模块】3-4、事件模块

推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • QQ群:398291828
  • 小红书
  • 小破站

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

【Unity3D框架】SKFramework框架完全教程《全网最全》-专栏文章目录:
https://blog.csdn.net/q764424567/article/details/143926557

二、正文

2-1、介绍

事件模块主要指的是事件委托模块。

委托相比大家都不陌生,在C#中,委托是一种引用类型,它表示对方法的引用,即委托就是一种用来指向一个方法的引用类型变量。委托的声明类似于方法签名,关键字是delegate。
下面是一个委托的声明和使用的例子:

// 声明一个委托
public delegate void MyDelegate(string message);public class Program
{static void Main(string[] args){// 创建委托实例,绑定到具体的方法MyDelegate myDelegate = new MyDelegate(DisplayMessage);// 使用委托myDelegate("Hello, World!");}// 与委托具有相同签名的方法static void DisplayMessage(string message){Console.WriteLine(message);}
}

委托简单理解就是先绑定事件,然后在合适的位置执行事件,最后将数据或者参数返回。

2-2、使用说明

SKFramework框架的事件模块,是将委托事件进行了封装,重载了方法,方便调用。

事件模块:订阅委托事件,11个重载方法:
在这里插入图片描述
事件模块:取消订阅委托事件,12个重载方法:
在这里插入图片描述
事件模块:执行事件:
在这里插入图片描述

接下来演示一下如何使用。

示例:

using UnityEngine;
using SK.Framework;
using SK.Framework.Events;
using System.Collections.Generic;public class UseEvents : MonoBehaviour
{Events m_Event;Dictionary<string, List<string>> m_Dic;void Start(){m_Event = SKFramework.Module<Events>();// 订阅m_Event.Subscribe(100, () => { Debug.Log("执行100事件"); });m_Event.Subscribe(0, (value) => { ShowInfo((InfoDataEventArgs)value); });m_Event.Subscribe<string, string>(102, (value1, value2) => { ShowInfo(value1, value2); });}void ShowInfo(InfoDataEventArgs args){Debug.Log(args.UserFun());}void ShowInfo(string info1, string info2){Debug.Log(info1 + " " + info2);}void Update(){if (Input.GetKeyDown(KeyCode.W)){m_Event.Publish(100);}if (Input.GetKeyDown(KeyCode.E)){InfoDataEventArgs data = new InfoDataEventArgs();data.Info = "自定义的数据";m_Event.Publish(data);}if (Input.GetKeyDown(KeyCode.R)){m_Event.Publish(102, "传递的值1", "传递的值2");}}
}public class InfoDataEventArgs : EventArgs
{public override int ID { get; }public override void OnInvoke() { }public string Info { get; set; }// 自定义函数public string UserFun(){return Info;}
}

执行结果:
在这里插入图片描述

说明:
1、单个委托事件,可以直接

订阅事件:
m_Event.Subscribe(100, () => { Debug.Log("执行100事件"); });
执行委托:
m_Event.Publish(100);

2、多参委托事件调用:

订阅事件:
m_Event.Subscribe<string, string>(102, (value1, value2) => { ShowInfo(value1, value2); });
执行委托:
m_Event.Publish(102, "传递的值1", "传递的值2");

3、自定义事件处理类

自定义事件处理类:
public class InfoDataEventArgs : EventArgs
{public override int ID { get; }public override void OnInvoke() { }public string Info { get; set; }// 自定义函数 可以实例化的时候写入数据public string UserFun(){return Info;}
}
订阅事件:
m_Event.Subscribe(0, (value) => { ShowInfo((InfoDataEventArgs)value); });执行委托:
InfoDataEventArgs data = new InfoDataEventArgs();
data.Info = "自定义的数据";
m_Event.Publish(data);

2-3、实现及代码分析

委托事件存放在字典中:

private readonly Dictionary<int, List<Delegate>> m_Dic = new Dictionary<int, List<Delegate>>();

订阅事件:

public void Subscribe(int eventId, Action callback)
{SubscribeInternal(eventId, callback);
}
private void SubscribeInternal(int eventId, Delegate callback)
{if (!m_Dic.ContainsKey(eventId))m_Dic.Add(eventId, new List<Delegate>());m_Dic[eventId].Add(callback);
}

取消订阅:

        private bool UnsubscribeInternal(int eventId, Delegate callback){if (m_Dic.TryGetValue(eventId, out List<Delegate> list)){list.Remove(callback);if (list.Count == 0)m_Dic.Remove(eventId);return true;}return false;}

执行:
在这里插入图片描述
总体来说代码难度不大,简单又粗暴。

自定义事件处理类需要继承基类,然后重写自己的方法。

三、后记

如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多Unity干货文章。


你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。

博主还有跟多宝藏文章等待你的发掘哦:

专栏方向简介
GameFramework框架框架Unity之GameFramework框架快速应用、使用说明、源码分析等文章合集。
Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶入门从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUIUGUIUnity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合数据集合数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发日常记录主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/34727.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙分享:添加模块,修改app名称图标

新建公共模块common 在entry的oh-package.json5添加dependencies&#xff0c;引入common模块 "dependencies": {"common": "file:../common" } 修改app名称&#xff1a; common--src--resources--string.json 新增&#xff1a; {"name&q…

逆向攻防世界CTF系列48-Signin.md

逆向攻防世界CTF系列48-Signin.md 直接定位 输入&#xff0c;然后跟踪96A 一个整数一个余数你会发现这是把输入字符变成两个分开的十六进制存储起来&#xff0c;比如输入字符 ‘1’ &#xff0c;它的整数是49&#xff0c;49除16的整数是3&#xff0c;余数是1&#xff0c;在byt…

最新版Chrome谷歌加载ActiveX控件之金格iWebOffice2015控件

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

Lakehouse 架构下的元数据“大一统”管理深度解析

在湖仓一体&#xff08;Lakehouse&#xff09;出现之前&#xff0c;数据仓库和数据湖堪称数据领域的两大“顶流”。打个比方&#xff0c;要是把数据仓库比作一座大型图书馆&#xff0c;那其中的数据就如同馆内藏书&#xff0c;需要按照规范放好&#xff0c;借阅者只需依照类别索…

【AI系统】MobileVit 系列

MobileVit 系列 自 Vision Transformer 出现之后&#xff0c;人们发现 Transformer 也可以应用在计算机视觉领域&#xff0c;并且效果还是非常不错的。但是基于 Transformer 的网络模型通常具有数十亿或数百亿个参数&#xff0c;这使得它们的模型文件非常大&#xff0c;不仅占…

投稿指南——论文检索报告如何开具

【SciencePub学术】论文发表被SCI数据库收录之后&#xff0c;作为学术成果上报时&#xff0c;一般需要提供论文检索报告&#xff0c;SCI论文检索报告怎么开&#xff1f;在哪开&#xff1f;要注意什么&#xff1f;这些问题&#xff0c;本期小编给大家解答一下。 Q 开具检索报告…

Jenkins 推送报错 - SSH 密钥失效

目录 问题描述报错原因解决方案 问题描述 jenkins 构建完毕后&#xff0c;将构建好的 jar 包推送至远端服务器时&#xff0c;Deploy 阶段报如下错误&#xff1a; sshpass -p **** scp -o StrictHostKeyCheckingno -P 22 -r /data/jenkins/workspace/TAI/TAI/AllCam-tai-cloud/…

《ODIN: A Single Model for 2D and 3D Segmentation》CVPR2024

斯坦福和微软&#xff1a; 代码链接&#xff1a;ODIN: A Single Model For 2D and 3D Perception 论文链接&#xff1a;2401.02416 摘要 这篇论文介绍了ODIN&#xff08;Omni-Dimensional INstance segmentation&#xff09;&#xff0c;一个能够同时处理2D RGB图像和3D点云…

三、代码管理-Git

文章目录 前言一、Git1. Git 与 SVN 区别2. Git 入门3. 客户端工具4. 主流Git仓库 二、GitLab1. 介绍2. 适合的场景 二、GitHub1. 介绍2. 适合的场景 三、Gitee1. 介绍2. 适合的场景 四、GitCode1. 介绍2. 适合的场景 五、总结 前言 代码托管‌ Git作为目前最为流行的版本控制…

npm, yarn, pnpm之间的区别

前言 在现代化的开发中&#xff0c;一个人可能同时开发多个项目&#xff0c;安装的项目越来越多&#xff0c;所随之安装的依赖包也越来越臃肿&#xff0c;而且有时候所安装的速度也很慢&#xff0c;甚至会安装失败。 因此我们就需要去了解一下&#xff0c;我们的包管理器&#…

vscode上传本地文件到服务器

vscode上传本地文件到服务器 首先下载插件SFTP&#xff0c;我们通过ftp进行文件传输 VScode打开要传输的文件 使用快捷键 ctrlshiftP 打开搜索窗口&#xff0c;搜索SFTP 点击之后vscode文件夹下会生成对应json文件 我们编辑json信息根据远程的服务器情况填写&#xff0c;比如…

Next.js 实战 (二):搭建 Layouts 基础排版布局

前言 等了许久&#xff0c;Next.js 终于迎来了 v15.x 版本&#xff0c;刚好 Github 上面的旧项目重构完&#xff0c;终于可以放心大胆地去研究 Next.js了。 搭建最新项目可以参考官方文档&#xff1a;Installation 最新的 Next.js 版本&#xff0c;使用的是 React19.x 内测版…

Java的Stirng、StringBuilder、StringJoiner

黑马程序员Java个人笔记 目录 字符串比较 比较 boolean equals boolean equalsIgnoreCase 键盘录入和定义的字符串的比较 StringBuilder 打印 ​编辑 添加元素 反转 获取长度 toString 练习 对称字符串 拼接字符串 StringJoiner 概述 ​编辑 构造方法 只有…

elasticsearch(三)

文章目录 1.数据聚合1.1.聚合的种类1.2.DSL实现聚合1.2.1.Bucket聚合语法1.2.2.聚合结果排序1.2.3.限定聚合范围1.2.4.Metric聚合语法 1.3.RestAPI实现聚合1.3.1.API语法1.3.2.业务需求1.3.3.业务实现 2.自动补全2.1.拼音分词器2.2.自定义分词器2.3.自动补全查询2.4.实现酒店搜…

Python_Flask03

这篇文章主要介绍的是数据库的增删改查操作&#xff0c;无多余好说的。 from flask import Flask from flask_sqlalchemy import SQLAlchemy from sqlalchemy import text from flask_migrate import Migrateapp Flask(__name__)# 本地基础信息的主机名 HOSTNAME "127.0…

Hive分区值的插入

对于Hive分区表&#xff0c;在我们插入数据的时候需要指定对应的分区值&#xff0c;而这里就会涉及很多种情况。比如静态分区插入、动态分区插入、提供的分区值和分区字段类型不一致&#xff0c;或者提供的分区值是NULL的情况&#xff0c;下面我们依次来展现下不同情况下的表现…

安达发|工业镜头APS高级排产的关键约束

工业镜头生产具有其特定的复杂性&#xff0c;如技术要求高、生产周期长、工序多等特点。在应用APS系统进行高级排产时&#xff0c;需要考虑以下关键约束&#xff1a; 1. 技术与质量约束 - 精度要求&#xff1a;工业镜头对精度的要求极高&#xff0c;这直接影响到排产计划中机加…

【SKFramework框架核心模块】3-9、资源模块

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群&#xff1a;398291828小红书小破站 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【Unity3D框架】SKFramework框架完全教程《全…

Swing中密码框组件

一、介绍 密码框&#xff08;JPasswordField&#xff09;与文本框的定义和用法基本相同&#xff0c;唯一不同的是密码框将用户输入的字符串以某种符号进行加密。密码框对象是通过javax.swing.JPasswordField类创建的。 二、常用构造方法 1、public JPasswordField() 2、pub…

SpringMVC ——(1)

1.SpringMVC请求流程 1.1 SpringMVC请求处理流程分析 Spring MVC框架也是⼀个基于请求驱动的Web框架&#xff0c;并且使⽤了前端控制器模式&#xff08;是⽤来提供⼀个集中的请求处理机制&#xff0c;所有的请求都将由⼀个单⼀的处理程序处理来进⾏设计&#xff0c;再根据请求…