ToB企服应用市场:ToB评测及商务社交产业平台

标题: Unity架构师进阶:红点系统的架构与筹划 [打印本页]

作者: 拉不拉稀肚拉稀    时间: 2024-6-14 22:45
标题: Unity架构师进阶:红点系统的架构与筹划
面试的时间经常被问道怎样来筹划一个红点系统,本文将详细地先容怎样筹划一个红点系统,有哪些接口,并完整地给出实现。
红点系统的需求分析
起首我们来分析一下红点系统的筹划需求: 红点系统严格意义上来说不属于框架,而是游戏逻辑,以是代码不要放到通用的框架里面,并不属于底子服务。它是为了在游戏逻辑开发中很好的提示未处置惩罚的信息。对于利用者而言,它们盼望红点系统能直接给他们提供接口和服务,能方便的把红点显示在特定的节点下,并设置到特定的位置。利用者不消关心红点的”样子”,不消关心红点怎样创建,反复创建和烧毁红点的性能等。
对啦!这里有个游戏开发交换小组里面聚集了一帮热爱学习游戏的零底子小白,也有一些正在从事游戏开发的技术大佬,接待你来交换学习。
从需求分析得出”红点系统”对外提供的接口如下:
1: 编写接口”CreateRedPoint”,用来创建一个”红点”的节点,返回节点给利用者,至于红点放什么位置由利用者决定;
2: 编写接口”DestroyRedPoint”,用来删除烧毁一个红点节点;
3: 编写接口”SetRedPointValue”, 把红点节点转达进来,然后设置红点里面的具体数值;
4: 编写接口”DestroyAllRedPoints”, 用来在UI界面烧毁时把它下面所有的红点都删除接纳;
由于”红点系统”会要经常创建和删除节点,以是内部采用节点池的模式,这样能最大限度地提升性能。
红点系统依靠的底子服务
红点系统并不是完全独立地,依靠框架地底子服务,一个是资源管理,主要负责加载红点的节点资源,一个是节点池管理模块。资源管理模块示例代码里面采用的是YooAssets,然后把红点节点做成预制体,然后通过YooAssets网络打包,然后通过代码来加载节点资源。红点系统内部基于节点池机制,以是要给红点节点创建一个特有的节点池。
YooAssets的版本:1.5.2
资源管理ResMgr: 基于YooAssets,做的同步/异步资源管理
节点池: 自己实现,详情见代码;
红点的节点预制体: RedPoint节点下面有两个子节点,一个赤色的圆形精灵,一个是文字Label,用来显示数字,如下图所示:


红点系统代码具体实现
编写一个RedPointFlag组件,继承Component,用来标记哪些节点是红点,这个组件的作用是在一个UI界面烧毁的时间,方便利用这个Flag组件,找到所有的”红点”,并把它们一起接纳。
public class RedPointFlag : Component
{
}
编写一个RedPointMgr的全局单例,用来提供”红点”服务。提供Init接口,在Init的时间,给红点的创建一个节点池。代码如下:
public class RedPointMgr : UnitySingleton<RedPointMgr>
{
public void Init() {
NodePoolMgr.Instance.AddNodePool("GUI/Prefabs/RedPoint.prefab", 10);
}
}
CreateRedPoint接口:
public GameObject CreateRedPoint() {
GameObject redPoint = NodePoolMgr.Instance.Get("GUI/Prefabs/RedPoint.prefab");
if (redPoint.GetComponent<RedPointFlag>() == null) {
redPoint.AddComponent<RedPointFlag>();
}
return redPoint;
}
在这个接口中要特殊的注意,我们给红点节点添加一个RedPointFlag的组件实例,方便背面把所有的红点找出来。
SetRedPointValue接口:
public void SetRedPointValue(GameObject redPoint, int value) {
var label = redPoint.GetComponentInChildren<Text>();
label.text = value.ToString();
}
用来给红点设置对应的显示值,原理比较简单,找到红点里面的Text组件,修改Text组件的显示内容即可。
DestroyRedPoint接口:
public void DestroyRedPoint(GameObject redPoint) {
NodePoolMgr.Instance.Recycle("GUI/Prefabs/RedPoint.prefab", redPoint);
}
删除一个红点,这里主要是调用节点池接纳。
DestroyAllRedPoint接口:
public void DestroyAllRedPoint(GameObject uiRoot) {
RedPointFlag[] redPoints = uiRoot.GetComponentsInChildren<RedPointFlag>();
for (int i = 0; i < redPoints.Length; i++) {
NodePoolMgr.Instance.Recycle("GUI/Prefabs/RedPoint.prefab", redPoints.gameObject);
}
}
删除所有的红点,这里就利用了RedPointFlag组件,通过把带有这个组件的所有节点筛选出来,就是我们的红点节点了。然后把所有的节点接纳即可。
接下来给个简单的利用示例,用起来非常简单方便,在UI代码里面创建一个红点,并在界面烧毁的时间,删除所有的红点:
public class UIHomeCtrl : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Transform root = this.transform.Find("Bottom/start/btnStart");
var redPoint = RedPointMgr.Instance.CreateRedPoint();
redPoint.transform.SetParent(root, false);
redPoint.transform.localPosition = new Vector3(120, 40, 0);
RedPointMgr.Instance.SetRedPointValue(redPoint, 20);
}
private void OnDestroy()
{
RedPointMgr.Instance.DestroyAllRedPoint(this.gameObject);
}
}
本日的分享就到这里了,必要完整代码的,可以关注我们,领取完整代码”。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4