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);
    }
}

  今天的分享就到这里了,需要完整代码的,可以关注我们 + 企.鹅.裙 428 540 563 获取更多的相关资料。

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity是一款强大的游戏开发引擎,也被广泛用于开发大型多人在线角色扮演游戏(MMORPG)。在MMORPG开发中,网络架构设计与实现源码是非常重要的核心技术。首先,Unity客户端网络架构设计需要考虑到多个玩家之间的实时通讯和同步,以及与服务器的数据交换。 在网络架构设计上,首先需要考虑到如何处理玩家之间的实时通讯和同步。这部分源码需要实现基于UDP或TCP的网络通讯,同时考虑到玩家位置、动作、状态等数据的同步,并采用合适的压缩和插值算法来保证玩家之间的数据同步和流畅性。 其次,与服务器的数据交换也是Unity客户端网络架构设计的重要一环。这部分源码需要实现与服务器的通讯协议,包括登录认证、游戏数据同步、战斗事件处理等。同时需要考虑到网络延迟和丢包等问题,采用合适的重试机制和数据校验算法来保证通讯的稳定性和可靠性。 在实现上,可以采用C#等语言编写网络架构设计的源码。由于Unity本身内置了一些网络通讯的API和组件,开发者可以基于这些API和组件进行二次开发,加快开发速度和降低成本。同时,还可以借助一些开源的网络库和框架来提高网络通讯的效率和性能。 总之,Unity客户端网络架构设计与实现源码是MMORPG开发中的重要核心技术,需要综合考虑玩家之间的实时通讯和同步,以及与服务器的数据交换。通过合理的网络架构设计和源码实现,可以提高游戏的网络性能和稳定性,带来更好的游戏体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值