首页 > 其他分享 >Unity简易事件系统

Unity简易事件系统

时间:2024-02-19 18:34:44浏览次数:20  
标签:string void dic 简易 Unity tag static 事件 public

事件系统是一个基于观察者模式之上构建的系统。通过利用delegate来进行Multicasting,实现一处激发则一触全发。

​ 以下代码以简单的形式实现了一个仅限void类型函数的事件系统。

public class EventManager : MonoSingleton<EventManager>
{
    private static Dictionary<string, Action> dic = new Dictionary<string, Action>();
    public static void AddEvt(string tag, Action subscribe)
    {
        if(dic.ContainsKey(tag))
            dic[tag] += subscribe;
        else
            dic.Add(tag, subscribe);
    }

    public static void DeleteEvt(string tag)
    {
        if(!dic.ContainsKey(tag))
            throw new Exception("Tag \"" + tag + "\" not found in the list");
        dic.Remove(tag);
    }

    public static void CancelSubscribe(string tag, Action subscribe)
    {
        if(!dic.ContainsKey(tag))
            throw new Exception("Event \"" + tag + "\" not found in the list.");
        dic[tag] -= subscribe;
    }

    public static void invokeEvt(string tag)
    {
        if(!dic.ContainsKey(tag))
            throw new Exception("Event \"" + tag + "\" not found in the list.");
        dic[tag]();
    }

    public static void AllClear()
    {
        dic.Clear();
    }
}

一、为什么以string为关键词,而没用Enum

​ 实际上两者都可以,但是我喜欢string,并且以string为关键词时拓展起来也比较方便。当然,缺点也很显而易见,如果事件数量逐渐增多,那么string的内容必须要做好管理,并且得保证不重名&没有错字。如果是enum则不会有这个问题。但是我就是喜欢string

二、思路

​ 首先,新建一个Dictionary

public static void AddEvt(string tag, Action subscribe)

​ 用string来作为关键词(事件名字)来查找对应的Action,如果对应事件不存在,那就建立,如果已经存在了,那就只给对应Action继续添加内容。

public static void DeleteEvt(string tag)

​ 查找对应的tag,如果不存在那就及时抛出错误。如果存在,那就直接把整个事件全删了。

public static void CancelSubscribe(string tag, Action subscribe)

​ 仅去除其中一个关注者。

public static void invokeEvt(string tag)

​ 调用对应事件。

public static void AllClear()

​ 事件全删了,一个不留。


备注:

Action

Action的本质就是一层简单封装过的delegate,没有任何后续描述时,Action则作为无传入任何参数的void函数,没有返回值。如需要返回值,则可去参考Func

MonoSingleton<T>

详见单例篇,此处借用单例系统来单例化事件管理者。根据实际需要,也不一定要将管理者作为单例处理,也可以考虑直接以此为一个基类拓展出不同的事件管理者。

标签:string,void,dic,简易,Unity,tag,static,事件,public
From: https://www.cnblogs.com/ComputerEngine/p/18021718

相关文章

  • Unity常用设计模式之工厂模式
    工厂模式是一种常用的设计模式,它属于创建型模式,用于创建对象的过程中。在Unity中,工厂模式可以帮助我们更好地管理和创建对象,提高代码的可维护性和可扩展性。接下来,我将详细介绍Unity中常用的工厂模式。一、工厂模式概述工厂模式是一种创建型设计模式,它提供了一个统一的接口来创......
  • Unity UGUI的DrawCall优化
    UnityUGUI是一种强大的用户界面设计工具,它可以帮助开发者快速创建各种界面元素,从按钮和文本到滑块和面板等。然而,在使用UGUI时,一个常见的性能瓶颈就是DrawCall过多导致的性能下降。在本文中,我们将深入探讨UGUI的DrawCall优化方法,并给出对应的代码实现。什么是DrawCall?在Unity......
  • Unity红点系统的架构与设计
    在游戏开发中,红点系统是一种常见的功能,用于提示玩家有未读消息或待处理任务。在Unity引擎中,我们可以使用脚本来实现红点系统,下面我将介绍一种基于Unity的红点系统的架构与设计,并给出对应的代码实现。红点系统的代码实现首先,我们需要创建一个红点管理器的脚本RedDotManager.cs,......
  • Unity常用设计模式之代理模式
    代理模式是一种常用的设计模式,它允许一个对象代表另一个对象进行访问。在Unity中,代理模式经常被用来控制对某些对象的访问,以便在访问对象的同时进行一些额外的操作,比如权限控制、缓存、日志记录等。代理模式的结构包括三个角色:抽象主题(Subject)、真实主题(RealSubject)和代理(Proxy)。......
  • Unity 2022.3.20f1新功能,异步实例化预制体Object.InstantiateAsync
    今天查看Unity2022.3.20f1更新日志,发现新增了个异步实例化的功能,这个功能解决了Unity历史上实例化预制体卡顿的痛点,简直不要太爽。具体的API文档请点击跳转。做了个简单的实例化测试,实例化500*500个Cube,耗时9.2s。实例化过程之间不会卡顿,可以做其他事情,即便是在重度游戏加载场......
  • 软件架构模式之第五章:事件驱动架构
     第五章:事件驱动架构近年来,事件驱动架构风格显著增长并广泛应用,我们对其理解方式也发生了改变。这种高采用率并不令人意外,因为事件驱动架构能够解决复杂的非确定性工作流和高度反应和响应的系统等难题。此外,新技术、工具、框架和基于云的服务使得事件驱动架构比以往更易访问......
  • three.js的物体点击事件
    直接粘贴无脑用 !!!vue文件执行要现在初始化方法里面调用一下onclickS(){   letraycaster=newTHREE.Raycaster();   letmouse=newTHREE.Vector2();     functiononmodelclick(event){    mouse.x=(event.clientX/window.innerWidt......
  • Unity框架设计系列:Unity 如何设计网络框架
    在Unity框架设计中与游戏服务器对接的网络框架也是非常重要的一个模块,本文給大家分享如何来基于Unity来设计一个网络框架,主要的讲解以下几个点:(1)TCP半包粘包,长连接与短连接,IO阻塞;(2)TcpSocket与UDPSocket的技术方案;(3)Unity的序列化与反序列化技术方案;(4)TCP的......
  • Unity资源管理系列:Unity项目开发中如何做资源加密
    Unity的游戏很容易被人反编译出来,然后再重新打包发布,把自己辛辛苦苦开发的游戏,抄写的一丝不挂。很多项目要求要做好资源加密,Unity中如何做好资源加密呢?本文給大家分享加密算法+资源打包整合思路:(1)游戏资源加密如何选择加密算法;(2)Assetsbundle资源包的加密与解密;游戏资源......
  • gsap 事件
    1ScrollTrigger.create({2trigger:'.box',3start:'toptop',4end:'+=2000',5markers:true,6scrub:true,7pin:true,8animation:9gsap.ti......