首页 > 其他分享 >Unity架构师进阶:红点系统的架构与设计

Unity架构师进阶:红点系统的架构与设计

时间:2024-01-29 09:44:47浏览次数:20  
标签:进阶 Instance redPoint 接口 节点 public 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[i].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);

}

}

今天的分享就到这里了,需要完整代码的,可以进入小组,领取完整代码。

标签:进阶,Instance,redPoint,接口,节点,public,Unity,架构师,红点
From: https://www.cnblogs.com/bycw/p/17993843

相关文章

  • FMEA:总监和架构师都在用的高可用架构分析方法
    FMEA:总监和架构师都在用的高可用架构分析方法记得之前准备春晚项目的时候,团队成员在一起过架构,老板最常问的问题是“这个组件挂了怎么办?有什么影响?”,我当时还在心里默默嘀咕:这咋都这么容易挂呢?其他组件不做高可用的吗?最近看到FMEA,我恍然大悟:哦,这原来不就是FMEA吗?原来是我“有......
  • FMEA:总监和架构师都在用的高可用架构分析方法
    目录FMEA:总监和架构师都在用的高可用架构分析方法一、高可用架构1.1什么是高可用1.2高可用的度量1.3高可用实现与架构之道二、初识FMEA2.1什么是FMEA2.2何时使用FMEA三、FMEA实战3.1传统制造流程如何做FMEA3.2软件如何做FMEA四、总结参考文献......
  • C# 面向对象编程进阶:构造函数详解与访问修饰符应用
    C#构造函数构造函数是一种特殊的方法,用于初始化对象。构造函数的优势在于,在创建类的对象时调用它。它可以用于为字段设置初始值:示例获取您自己的C#服务器创建一个构造函数://创建一个Car类classCar{publicstringmodel;//创建一个字段//为Car类创建一个......
  • C# 面向对象编程进阶:构造函数详解与访问修饰符应用
    C#构造函数构造函数是一种特殊的方法,用于初始化对象。构造函数的优势在于,在创建类的对象时调用它。它可以用于为字段设置初始值:示例获取您自己的C#服务器创建一个构造函数://创建一个Car类classCar{publicstringmodel;//创建一个字段//为Car类创建一......
  • Unity面试题:热更新篇(一)
    请简要介绍Unity热更新的原理和实现方式。答:Unity热更新的原理是通过将游戏的资源和代码分离,将代码部分放置在服务器端,游戏启动时通过网络下载更新的代码并动态加载,以达到实现热更新的目的。实现方式包括AssetBundle、ILRuntime等。对啦!这里有个游戏开发交流小组里面聚集了一帮热......
  • Unity塔防游戏的制作与实现
    一、游戏场景的搭建首先,我们需要创建一个新的Unity场景,并将场景设置为2D模式。然后,我们需要导入一些必要的素材,如地图、塔、怪物、子弹等。我们可以从UnityAssetStore中下载这些素材,或者自己制作。接下来,我们需要将地图和塔防元素放置在场景中。我们可以使用Unity的2DTilemap......
  • Unity 实现一个FPS游戏的全过程
    Unity是一款功能强大的游戏引擎,它提供了各种各样的工具和功能,以帮助开发者轻松地创建精美的3D游戏和应用程序。在本文中,我们将使用Unity实现一个FPS游戏的全过程,从场景设计、角色控制、敌人AI到最终的打包发布。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础......
  • Unity 的行为决策树的技术原理
    Unity的行为决策树是一种强大的工具,用于创建复杂的游戏人工智能(AI)。行为决策树是一种图形化的编程工具,它可以将游戏角色的行为和决策过程可视化,从而使开发人员更容易理解和调试游戏AI。在本文中,我们将详细讲解Unity的行为决策树的技术原理,并给出相应的代码实现。对啦!这里有个游戏......
  • unity打造基于增量断点更新的下载框架与代码实现
    Unity是目前最流行的游戏引擎之一,它可以用来制作各种类型的游戏,例如2D和3D游戏。在游戏开发过程中,我们通常需要使用一些下载框架来帮助我们管理和更新游戏资源。其中,增量断点更新是一种非常重要的技术,它可以大大减少游戏下载和更新的时间和流量。对啦!这里有个游戏开发交流小组里......
  • 【C语言进阶篇】模拟实现通讯录 (内附源码)
    (文章目录)......