Unity中基于前缀树的高性能红点系统实现

文章主要介绍了红点系统的特点,如何基于前缀树这一数据结构实现红点系统,提出了相关实现中存在的两个性能问题,以及如何去解决这两个问题,并在最后基于UnityEditor的TreeView开发了树视图窗口,方便使用者在开发阶段的Debug需求。


红点系统是在大部分游戏中都能看到的常见需求。

其作用在于,在玩家达成某种条件时(如新获得某个装备、道具数量达到某个需求),在相关的UI上亮起红点来提示玩家进行相关操作。

红点系统的一个鲜明特征即是它的“层层套娃”性,子界面亮起红点时其父界面也需要同时被亮起红点,一直点亮到主界面为止。

以下图为例,当某个特定的主线章节亮起红点时,

 

其父界面的主线章节按钮和出击页签也需要被亮起红点。

 

最后主界面上的出击按钮也会亮起红点来最终达到提示玩家的目的。

 

如此层层嵌套下来,如果不对父子红点进行统一的触发管理,而是让负责各个模块的程序员各自管理,必将导致各个模块的红点触发逻辑难以维护且性能堪忧的结果。

而针对红点系统这种十分强调父子关系的业务需求,使用“前缀树”进行管理将是非常好的选择。

那么何为前缀树呢?

前缀树本质上是一种多叉树,树节点存储了字符,具有相同前缀的字符串将具有相同的父节点,在进行字符串保存和查找时具有较好的性能优势。

 

通过将红点抽象为路径,只需要稍加修改,让节点中存储对应的路径字符串和节点值,便可以方便地实现红点系统。

以之前的图为例,笔者将每一层UI都依其父子关系设置为树中节点,最终只需要点亮路径为MainAttack/Attack/Chapter/18的节点,便可以同时亮起其所有父节点对应的UI的红点。

 

而当叶子节点的红点被隐藏时,其所有父节点也会自动检测所有子节点状态来决定是否隐藏自身的红点。

 

使用前缀树来实现红点系统自然并非笔者的首创,但目前为止网上能找到的相关资料中往往存在两个性能痛点:

1. 在处理路径时直接使用split方法进行字符串暴力切割,导致造成额外的内存分配。

2. 在子节点状态改变后需要也改变父节点状态时不进行限制,多个子节点同时改变将导致额外的无用刷新。

笔者在后续章节对红点系统的具体实现中,便试图解决这两个痛点,并开发一个编辑器下的红点树可视化窗口,辅助使用者对红点系统进行Debug。

课程最后会提供包含完整代码与测试用例的Demo工程方便读者学习。

更多精彩课程可下载【在理】APP查看。

 

Unity红点系统是一种常用的游戏UI设计,主要用于提醒玩家当前有新的任务、奖励或其他未读信息需要处理。下面是一个简单的Unity红点系统设计: 1. 定义红点控件:在UI界面添加一个红点控件,通常是一个小圆点或小数字。该控件需要有一个唯一的名称,用于后续的操作。 2. 定义红点数据结构:为每个需要红点提醒的功能定义一个红点数据结构,包含以下信息: - 功能名称:用于标识该功能。 - 红点控件名称:与UI界面红点控件名称对应。 - 是否需要红点提醒:标识该功能是否需要红点提醒。 - 红点数量:如果需要显示数字红点,则需要记录具体的数量。 3. 定义红点管理类:创建一个红点管理类,用于管理所有的红点数据和UI界面上的红点控件。该类需要提供以下功能: - 添加红点数据:向红点管理类添加新的红点数据。 - 更新红点状态:根据红点数据的信息,更新UI界面上对应的红点控件状态。 - 监听红点变化:提供回调函数,当某个红点数据的状态发生变化时,通知相应的UI界面进行更新。 4. 使用红点系统:在需要使用红点系统的地方,调用红点管理类的方法添加红点数据和监听红点变化。当红点数据的状态发生变化时,红点管理类会自动更新UI界面上的红点控件状态。 通过以上步骤,就可以实现一个简单的Unity红点系统。当玩家有新的任务或奖励时,红点控件会自动提醒玩家,增强了游戏的交互性和用户体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值