首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 25-03-03 16:42
  • 3484
  • 5275
blog.csdn.net

推荐阅读

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

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

一、前言

【Unity3D框架】SKFramework框架完全教程《全网最全》-专栏文章目录:
http://iyenn.com/rec/1695645.html

二、正文

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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

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

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65

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

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

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

2、多参委托事件调用:

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

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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

2-3、实现及代码分析

委托事件存放在字典中:

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

订阅事件:

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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

取消订阅:

        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;
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

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

三、后记

如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多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和坑,让后来人可以有些参考。
Unity爱好者社区
微信公众号
分享Unity相关的技术文章、工具资源等。
注:本文转载自blog.csdn.net的恬静的小魔龙的文章"https://itmonon.blog.csdn.net/article/details/144174289"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top