首页 > 其他分享 >Unity游戏框架设计之任务管理器

Unity游戏框架设计之任务管理器

时间:2024-04-29 23:12:00浏览次数:24  
标签:EventCenter 订阅 管理器 框架 Unity handler eventKey public 事件

Unity游戏框架设计之任务管理器

简单介绍

在游戏开发中,我们可能会遇到下述需求。当角色的生命值减少时,我们需要让角色播放受伤动画,让系统播放角色受伤音效,将当前的新的生命值更新到 UI 上等等操作。如果在角色的代码中直接实现上述的操作,则将导致代码的高度耦合,不利于后期的维护和拓展。

为解决上面的问题,我们可以认为,当角色的生命值减少时,实际上会发布角色生命值减少事件,然后让订阅角色生命值减少事件的子系统分别处理此事件,这就是事件管理器的核心功能。

事件管理器基于发布订阅模式实现。通过发布与订阅功能,可以实现事件的发布者和订阅者之间解耦合,并提高代码的可维护性。

代码设计

public class EventManager : SingletonMono<EventManager>
{
    private static readonly Dictionary<string, Action<EventData>> EventCenter = new();

    public void Subscribe(string eventKey, Action<EventData> handler)
    {
        if (!EventCenter.TryAdd(eventKey, handler))
        {
            EventCenter[eventKey] += handler;
        }
    }

    public void Unsubscribe(string eventKey, Action<EventData> handler)
    {
        if (!EventCenter.ContainsKey(eventKey))
        {
            LogManager.Instance.DebugWarning($"不存在此事件。eventKey={eventKey}");
            return;
        }
        EventCenter[eventKey] -= handler;
        if (EventCenter[eventKey] == null || EventCenter[eventKey].GetInvocationList().Length == 0)
        {
            EventCenter.Remove(eventKey);
        }
    }

    public void Publish(string eventKey, EventData eventData)
    {
        if (!EventCenter.ContainsKey(eventKey))
        {
            LogManager.Instance.DebugLog($"事件没有被处理。eventKey={eventKey},eventData={eventData}");
            return;
        }
        Action<EventData> actionSet = EventCenter[eventKey];
        if (actionSet is null || actionSet.GetInvocationList().Length == 0)
        {
            LogManager.Instance.DebugWarning($"发布事件失败。没有事件处理器处理此事件。eventKey={eventKey},eventData={eventData}");
            return;
        }
        foreach (Delegate action in actionSet.GetInvocationList())
        {
            try
            {
                action.DynamicInvoke(eventData);
            }
            catch (Exception e)
            {
                LogManager.Instance.DebugWarning(e.ToString());
            }
        }
    }
    
    public abstract class EventData
    {
    }

    public class EmptyEventData : EventData
    {
    }

    public class NormalEventData<T> : EventData
    {
        public readonly T Data;

        public NormalEventData(T data)
        {
            Data = data;
        }
    }
}

代码说明

(一)实现事件的订阅与发布功能。

(二)eventKey 推荐格式为 public static readonly string {FieldName} = "{ClassName}{FieldName}"; 不推荐添加 ID 后缀。

(三)handler 参数传递的事件函数推荐以 OnXXX 作为前缀。

(四)订阅方法 Subscribe() 必须与取消订阅方法 Unsubscribe() 配对使用。如果在 Awake()/OnEnable()/Start() 中调用 Subscribe(),则必须在 OnDisable()/OnDestroy() 中取消订阅,否则可能导致事件发布时由于没有取消订阅导致错误处理的问题。

后记

由于个人能力有限,文中不免存在疏漏之处,恳求大家斧正,一起交流,共同进步。

标签:EventCenter,订阅,管理器,框架,Unity,handler,eventKey,public,事件
From: https://www.cnblogs.com/kkelin/p/18166803

相关文章

  • Unity游戏框架设计之消息管理器
    Unity游戏框架设计之消息管理器简单介绍消息管理器又可以称为任务管理器,主要解决延迟执行某些代码的问题。比如,我们希望一些代码可以延迟指定的时间后才执行,或者我们希望一些代码可以在固定的时间执行,又或者我们希望一些代码可以每隔一段时间就执行一次。消息管理器就是为了实现......
  • Unity游戏框架设计之协程管理器
    Unity游戏框架设计之协程管理器代码设计/**协程管理器*/publicclassCoroutineManager:SingletonMono<CoroutineManager>{/***创建CoroutineTask*/publicCoroutineTaskCreateCoroutine(IEnumeratorcoroutine,Action<bool>finishHandler......
  • Unity游戏框架设计之单例Mono
    Unity游戏框架设计之单例Mono简单介绍在编写Unity脚本的过程中,我们通常需要编写一些依赖于MonBehaviour生命周期且全局始终唯一的类,比如EventManager、TaskManager、ResourceManager和UIManager等等。我们可以基于单例模式,设计出名为SingletonMono的单例类,然后让拥......
  • httprunner测试框架(一):支持不同环境执行
     首先,httprunner已经是一个较完善的接口测试框架了,基本可以拿来即用,本文提供一种支持不同环境执行用例的实现思想,其余部分均是采用httprunner脚手架搭建-httprunner工作原理:执行前会先加载.env文件,将.env文件中的内容加载到内存中,如下图所示 -.env文件htttprunne......
  • 接口测试框架选择
    接口测试是现在比较有性价比的自动化测试方法目前常见的接口测试框架是1.Python+unittest+HtmlTestRunner;2.Python+Pytest+allure。下面描述一下2种框架的大概区别,可以自行判断使用的框架1、准备工作unittest是python自带的库,不用安装。可直接使用,该框架下需要仅需安......
  • 使用EF框架的优化(一)
    在.Net中使用EF框架(.Net7,数据库SQLserver)在EntityFramework(EF)中,LINQ查询会被翻译成对应的SQL查询语句,以便与数据库进行交互。EF根据LINQ查询中的方法调用和操作符来进行翻译,一些常见的规则包括:1.简单的查询表达式会直接被翻译成对应的SQL语句,如SELECT、FROM、WHERE、OR......
  • GUI 框架或UI工具包
    对于Go语言编写的GUI程序,以下是比较成熟的方案:1.fyne:Fyne是一个新的、易于使用的Go语言UI框架,他采用了基于模块的体系结构,提供了完整的API元素库,支持图形、文本、布局、画布等等。2.go-qml:GoQML是一个基于Go语言的跨平台界面设计工具,支持Windows,MacOSX,Ubun......
  • web自动化框架basepage
    #-*-coding:utf-8-*-#@Author:caiweichao#@explain:基类封装webdriver方法,方便调用,减少代码重复importrandomimporttimeimportallurefromseleniumimportwebdriverfromselenium.common.exceptionsimport*fromselenium.common.exceptionsimportT......
  • Linux软件包管理器,RPM和YUM的区别
    RPMRPM(RedhatLinuxPacketManger)是RedHat公司随RedhatLinux推出的一个软件包管理器,通过它能够轻松实现Linux软件的安装。但是,需要手动解决软件包的依赖关系。YUMYUM(YellowdogUpdater,Modified)是一个Shell前端软件包管理器。基于RPM包管理器,能够从指定的服务器自动......
  • golang中的ORM框架
    目录ORM框架GORM基本用法1.安装GORM2.连接数据库3.定义模型4.执行CRUD操作5.迁移和查询ORM框架在Golang中,ORM(Object-RelationalMapping,对象关系映射)框架是一种用于将面向对象的概念与关系型数据库中的表进行映射的工具。通过使用ORM框架,开发者可以更方便地执行数据库操......