面试的时候经常被问道如何来设计一个红点系统,本文将详细地介绍如何设计一个红点系统,有哪些接口,并完整地给出实现。
红点系统的需求分析
首先我们来分析一下红点系统的设计需求: 红点系统严格意义上来说不属于框架,而是游戏逻辑,所以代码不要放到通用的框架里面,并不属于基础服务。它是为了在游戏逻辑开发中很好的提示未处理的信息。对于使用者而言,它们希望红点系统能直接给他们提供接口和服务,能方便的把红点显示在特定的节点下,并设置到特定的位置。使用者不用关心红点的”样子”,不用关心红点如何创建,反复创建和销毁红点的性能等。
从需求分析得出”红点系统”对外提供的接口如下:
1: 编写接口”CreateRedPoint”,用来创建一个”红点”的节点,返回节点给使用者,至于红点放什么位置由使用者决定;
2: 编写接口”DestroyRedPoint”,用来删除销毁一个红点节点;
3: 编写接口”SetRedPointValue”, 把红点节点传递进来,然后设置红点里面的具体数值;
4: 编写接口”DestroyAllRedPoints”, 用来在UI界面销毁时把它下面所有的红点都删除回收;
由于”红点系统”会要经常创建和删除节点,所以内部采用节点池的模式,这样能最大限度地提升性能。
红点系统依赖的基础服务
红点系统并不是完全独立地,依赖框架地基础服务,一个是资源管理,主要负责加载红点的节点资源,一个是节点池管理模块。资源管理模块示例代码里面采用的是YooAssets,然后把红点节点做成预制体,然后通过YooAssets收集打包,然后通过代码来加载节点资源。红点系统内部基于节点池机制,所以要给红点节点创建一个特有的节点池。
YooAssets的版本:1.5.2
资源管理ResMgr: 基于YooAssets,做的同步/异步资源管理
节点池: 自己实现,详情见代码;
红点的节点预制体: RedPoint节点下面有两个子节点,一个红色的圆形精灵,一个是文字Label,用来显示数字,如下图所示:
红点系统代码具体实现