ET实现游戏中的红点提示系统(服务端)

news2024/11/25 11:01:17

目录

☝🤓前言

☝🤓一、实现思路

☝🤓二、实现

🤠2.1 定义红点组件

🤠2.2 定义Proto消息体

🤠2.3 RedPointComponentSystem

☝🤓难点


☝🤓前言

当我们闲来无事时打开农药想消磨一下时间的时候,进入游戏首先会有各种活动弹窗还有一大堆活动要领的物品;比如下面这张(网上找的网图)

这些要领的活动物品会通过红点来提示玩家领取,强迫症玩家进游戏会把所有红点都点完在开局(Doge.jpg)领完红点会消失。

现在策划把红点系统的任务交给我来做,我是怎么完成这个红点系统的呢?


☝🤓一、实现思路

先说一下思路:

  • 当我们打开游戏时红点会有一个初始化 —— 我们要在玩家刚进游戏时把所有会出现红点的状态数据传给前端进行初始化,这样后边游戏过程中我们只传状态发生变化的就好了。
  • 红点的状态是时刻都在变的,比如进游戏有红点提示你领取物品,领完红点会消失;完成对局达成某一项任务红点又会出现提示玩家领取物品。
  • 红点状态只在玩家玩游戏时进行判断,不储存到数据库中。

初始化问题我们要和前端协商,由前端定义枚举类型,比如战令奖励红点我们商定为 —— type=1001,系统邮件商定为 —— type=2001,玩家邮件商定为 —— type=2002。

服务端选择用定时任务来监测红点时刻都会变化的这一特点。

  • 玩家进入游戏红点系统的枚举就会进行初始化。
  • 当服务端检测有红点状态发生变化时,由定时任务来筛选出变化的红点状态进行传递给前端展示。

☝🤓二、实现

2.1 定义红点组件

红点组件挂载在Unit身上

字典类型Key存储前端定义的枚举type,Value存储红点状态:0 —— 红点熄灭,1 —— 红点亮起

当红点状态发生变化时消息Message负责主动给前端发送变化的红点状态

namespace ET.Server
{
    [ComponentOf(typeof(Unit))]
    public class RedPointComponent: Entity, IAwake, IDestroy, IDeserialize, ITransfer, IUnitCache
    {
        [BsonIgnore]
        public long Timer;

        //红点状态
        [BsonIgnore]
        public Dictionary<int, int> RedPointStatus = new Dictionary<int, int>();
        
        [BsonIgnore]
        public M2C_RedPointNotice Message = new M2C_RedPointNotice();
    }
}

2.2 定义Proto消息体

主动发消息通知前端变化了的红点状态:

message M2C_RedPointNotice //IActorMessage
{
	map<int32,int32> RedPointStatus = 1;
}

2.3 RedPointComponentSystem

namespace ET.Server
{
    public class  RedPointComponentAwakeSystem: AwakeSystem<RedPointComponent>
    {
        protected override void Awake(RedPointComponent self)
        {
            self.Timer = TimerComponent.Instance.NewRepeatedTimer(10000, TimerInvokeType.RedPointUpadte, self);
        }
    }
    
    public class  RedPointComponentDestorySystem: DestroySystem<RedPointComponent>
    {
        protected override void Destroy(RedPointComponent self)
        {
            TimerComponent.Instance.Remove(ref self.Timer);
        }
    }

    //定时任务每10秒执行一次
    [Invoke(TimerInvokeType.RedPointUpadte)]
    public class  TimingSaveComponentTimer : ATimer<RedPointComponent>
    {
        protected override void Run(RedPointComponent self)
        {
            try
            {
                if ( self.IsDisposed || self.Parent == null )
                {
                    return;
                }
                
                if ( self.DomainScene() == null)
                {
                    return;
                }
                self?.RedPointUpdate();
            }
            catch (Exception e)
            {
                Log.Error(e.ToString());
            }
        }
    }
    
    [FriendOf(typeof (RedPointComponent))]
    [FriendOf(typeof (Unit))]
    [FriendOf(typeof (EmailComponent))]
    public static class RedPointComponentSystem
    {
        /// <summary>
        /// 初始化活动红点状态,在进游戏接口中调用执行
        /// </summary>
        /// <returns></returns>
        public static async ETTask GetAllRedPointStatus(this RedPointComponent self)
        {
            Unit unit = self.GetParent<Unit>();

            //......有红点的所有活动都添加到字典中来进行初始化
            
            //拿邮件举例
            EmailComponent emailComponent = unit.GetComponent<EmailComponent>();
            emailComponent.EmailRedPoint();
            foreach (var item in emailComponent.RedPointStatus)
            {
                //将邮件红点的状态加入字典中
                self.RedPointStatus.Add(item.Key,item.Value);
            }

        }

        /// <summary>
        /// 更新红点状态,由定时任务执行,也可以在完成支付、完成对局、退出房间等重要节点也执行一次
        /// </summary>
        /// <param name="self"></param>
        public static async ETTask RedPointUpdate(this RedPointComponent self)
        {
            self.RedPointStatus.Clear();
            Unit unit = self.GetParent<Unit>();
            
            //......有红点的所有活动都进行判断变化与否

            //依然拿邮件举例
            EmailComponent emailComponent = unit.GetComponent<EmailComponent>();
            emailComponent.GetEmailManagerNews().Coroutine();
            
            // != null说明邮件红点发生变化,需要通知前端
            if (emailComponent.EmailRedPoint(1) != null)
            {
                //只有当红点变化时才会添加到字典
                self.RedPointStatus.Add(item.Key,item.Value);
            }

            if(self.RedPointStatus.Count == 0) return;
            
            //服务器主动发消息通知前端红点状态的变化
            UnitGateComponent unitGateComponent = unit.GetComponent<UnitGateComponent>();
            self.Message.FishRedPointStatus = self.RedPointStatus;

            ActorMessageSenderComponent.Instance.Send(unitGateComponent.GateSessionActorId, self.Message);
        }

    }
}

这样前端处理消息时只需遍历一次 RedPointStatus ,然后根据定义的枚举对应具体活动控制红点的显示与消失就可以了。

☝🤓总结

其实红点系统的实现并不难,难的是众多活动红点的判断是比较繁琐的,要具体到每个活动中去判断在集中到红点系统中去,是个体力活🤯。

补充:(小编目前也只做了这14个中的一个红点系统而已,红点系统前端也很麻烦,和我对接的前端好像用到了树结构来实现)

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

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

相关文章

数据结构-5.3.二叉树的定义和基本术语

一.二叉树的基本概念&#xff1a; 树是一种递归定义的数据结构&#xff0c;因此二叉树是递归定义的数据结构。 二.二叉树的五种状态&#xff1a; 三.几个特殊的二叉树&#xff1a; 1.满二叉树&#xff1a;结点总数就是通过等比数列公式求出来的&#xff0c;首项为1即根节点&a…

【网络协议】TCP协议常用机制——延迟应答、捎带应答、面向字节流、异常处理,保姆级详解,建议收藏

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;计算机网络那些事 前几篇文章&#xff0c;博主带大家梳理了一下TCP协议的几个核心机制&#xff0c;比如保证可靠性的 确认应答、超时重传 机制&#xff0c;和提高传输效率的 滑动窗口及其相关优化机…

C++ Builder XE12关于KonopkaControls与TMS VCL UI Pack组件的安装

1、先打开open project&#xff0c;选中安装的组件工程&#xff0c;并打开。 2、在option中设置 3、点击编译并进行安装install

洞察AI趋势:智享AI直播,打造专属你的数字化直播AIGC系统!

洞察AI趋势&#xff1a;智享AI直播&#xff0c;打造专属你的数字化直播AIGC系统&#xff01; 在当今这个日新月异的数字时代&#xff0c;人工智能&#xff08;AI&#xff09;已不再是遥不可及的未来科技&#xff0c;而是正深刻改变着我们生活、工作的每一个角落。其中&#xf…

幽默视频下载网站推荐

在快节奏的生活中&#xff0c;搞笑视频无疑是缓解压力的良药&#xff0c;不论是自制搞笑视频还是寻找素材来增添创作的趣味性&#xff0c;找到合适的视频素材至关重要。幸运的是&#xff0c;网络上有许多优秀的网站能够满足这一需求。以下是8个适合下载幽默搞笑视频素材的网站&…

华为 静态路由和bfd 侦测的实验

实验要求 sw1 上业务地址192.168.1.1/24 SW3 业务地址192.168.2.1/24 正常情况下走主链路&#xff0c;不正常的情况下走备份链路 2 配置 这是基本地址配置 开启了bfd 本端地址为 10.1.1.1 对端地址是10.1.1.2 关键是discrimination 分辨参数 …

静态路由和nqa 联动实验

nqa 配置 1 test 断端口 很明显是切换到备机上了

Word中如何删除表格下一页的空白页

Reference&#xff1a; [1] Word空白页怎么都删除不掉&#xff1f;用这6个方法随便删&#xff01; - 知乎 (zhihu.com)

前端埋点学习

前端埋点 前端数据埋点是在前端页面中通过代码的方式手机用户行为数据和页面性能的过程&#xff0c;通过在页面中插入指定的代码&#xff0c;实现实时监控用户在页面上的操作行为。 通常包括一下事件 定义事件: 定义需要手机的数据事件&#xff0c;如点击&#xff0c;浏览等添…

基于Docker的FRP内网穿透部署

服务器搭建&#xff08;FRPS&#xff09; 创建配置文件 # 创建存放目录 sudo mkdir /etc/frp # 创建frps.ini文件 nano /etc/frp/frps.ini frps.ini内容如下&#xff1a; [common] # 监听端口 bind_port 7000 # 面板端口 dashboard_port 7500 # 登录面板账号设置 dashboa…

【进阶OpenCV】 (9)--摄像头操作--->答题卡识别改分项目

文章目录 项目&#xff1a;答题卡识别改分1. 图片预处理2. 描绘轮廓3. 轮廓近似4. 透视变换5. 阈值处理6. 找每一个圆圈轮廓7. 将每一个圆圈轮廓排序8. 找寻所填答案&#xff0c;比对正确答案8.1 思路8.2 图解8.3 代码体现 9. 计算正确率 总结 项目&#xff1a;答题卡识别改分 …

数论与同余 - 离散数学系列(七)

目录 1. 整数的性质 整除与因数 最大公约数与最小公倍数 2. 欧几里得算法 算法步骤 3. 模运算与同余 模运算 同余关系 同余的性质 4. 数论在密码学中的应用 RSA 加密算法 5. 实际应用场景 1. 数字签名 2. 哈希函数与数据完整性 3. 密钥交换 6. 例题与练习 例题…

Java:方法详解

目录 一.什么是方法(method) 二.方法定义 三.方法中实参和形参的关系 四.方法重载 五.递归 一.什么是方法(method) 方法就是一个代码片段&#xff0c;再C语言中我们曾经学过一个类似的方式——函数&#xff0c;他们都是将具有独立功能的代码组织成一个整体&#xff0c;形成…

论文阅读 BLIP-2

Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models 使用冻结的图像编码器和大型语言模型进行语言-图像预训练的引导 BLIP-2 通过一个轻量级的查询变换器弥合了模态之间的差距。 Querying Transformer 第一阶段通过冻结的图像编…

高纯PGME和PGMEA市场规模:2023年全球市场规模为6.43亿美元

研究对象&#xff1a;高纯PGME和PGMEA行业 高纯PGME&#xff08;丙二醇甲醚&#xff09;和PGMEA&#xff08;丙二醇甲醚醋酸酯&#xff09;是重要的有机溶剂&#xff0c;广泛应用于半导体和面板制造领域&#xff0c;尤其是在光刻胶和清洗剂中。高纯度的PGME和PGMEA对于确保电子…

软件测试面试题600多条及答案

这些问题都是软件测试领域常见的面试问题&#xff0c;以下是一些可能的答案&#xff1a; 什么是软件测试&#xff1f; 软件测试是一系列活动&#xff0c;旨在评估软件产品的质量和性能&#xff0c;以确保它符合规定的需求和标准。它包括执行程序或系统以验证其满足规定需求的过…

javaWeb-Mybatis操作

1.删除 2.新增 注意&#xff1a; 1. 使用对象来接收 2.插入的数据的名字&#xff0c;要和对象的属性名一致 3.新增(主键返回) 4.更新 5.查询&#xff08;根据id查询&#xff09; 会把查询到的数据映射到字段上。 6.查询(条件查询) %张%-->%${name}%

前端必知必会-Bootstrap 5 工具提示Tooltip

文章目录 Bootstrap 5 工具提示如何创建工具提示定位工具提示 总结 Bootstrap 5 工具提示 工具提示组件是一个小的弹出框&#xff0c;当用户将鼠标指针移到元素上时会出现&#xff1a; 如何创建工具提示 要创建工具提示&#xff0c;请将 data-bs-toggle“tooltip” 属性添加…

人工智能长期记忆的新突破:HippoRAG的创新框架

人工智能咨询培训老师叶梓 转载标明出处 大模型&#xff08;LLMs&#xff09;在预训练后&#xff0c;如何有效地整合大量新经验&#xff0c;同时避免灾难性遗忘&#xff0c;一直是人工智能领域的难题。尽管已有的检索增强生成&#xff08;RAG&#xff09;方法为LLMs提供了长期…

云轴科技ZStack入选信通院《高质量数字化转型产品及服务全景图》AI大模型图谱

近日&#xff0c;由中国互联网协会中小企业发展工作委员会主办的“2024大模型数字生态发展大会暨铸基计划年中会议”在北京成功召开。会上发布了中国信通院在大模型数字化等领域的多项工作成果&#xff0c;其中重点发布了《高质量数字化转型产品及服务全景图&#xff08;2024上…