0%

Demo作品现状

作品现状视频链接:https://www.bilibili.com/video/BV1Tw4m127Tj/

补充说明

1、前言

该文本简单介绍Demo开发过程中一些系统框架的设计思路和想法。
本人经验有限,框架会存在很多问题,有待后续学习将框架优化并完善。

2、热更流程设计思路

为了加快Demo进程,本次资源加载都使用的是Addressable官方插件。代码的热更使用HybridCLR来实现。

基于Addressable实现的资源热更流程,图示:

Addressable实现热更流程

大体流程:

  • ** 包准备阶段:** 打包->远端仓库->生成md5列表(用于验证完整性)。
  • ** Demo启动热更:** 本地启动->是否可连接到远端->下载远端md5列表->与本地md5列表比较->获取远端需要下载的bundle列表->下载所需的bundle包 ->继续游戏流程

最初设计想法本地不保存md5列表,因为考虑到一些特殊情况如:本地md5列表和本地bundle包不匹配时无法保证bundle包的一致性。

但是如果随着项目资源量的增加,热更检查遍历每个bundle包并检查md5是非常缓慢的,于是决定本地缓存md5列表。对于遍历本地bundle包进行检查的方案,可以作为热更后游戏异常的修复手段。

3、资源预加载的想法

设计原因:

  1. 游戏中可能存在需要大量创建一个资源实例的情况,例如:角色模板
  2. Addressable主要支持的都是异步加载和实例化,但一些情况需要一帧内批量生成多个实例化对象,单靠Addressable就不可靠了。

思路:

项目内所有资源加载全都依靠Addressable进行。

  1. 需要预加载资源模块去申请需要预加载的资源得到一个Handle。
  2. 当要获取实例时通过Handle获取,其内部会为资源进行计数+1。
  3. 释放实例时也通过Handle释放,内部计数-1。
  4. 当模块清除或被销毁时,通过Handle将资源释放。简单地说需要有一个模块来管理 一个资源的加载和释放流程,比较适用于需要大量创建资源实例的场景。

设计图示

预加载思路

4、战斗单元相关设计

4.1 Actor的结构设计

初期需要设计一个Actor框架以继续开发,展示的仅仅是一个简单的结构。

Actor结构

  • Actor: 是游戏中玩家,敌人,npc等基础单元。
  • ActorData: 主要存储单元的属性和参数相关的数据
  • ActorBehaviour: 主要管理Actor的模型和移动等表现相关的组件。
  • FSMManager: 管理状态机
  • CommandManager: 管理该Actor相关的指令,例如玩家输入指令,释放技能指令等
  • CommponentAgent: 可以为Actor添加不同的Component以实现不同的逻辑。

4.2 Actor状态机想法

设计时希望能手动配置每个Actor的状态机,希望每个Actor可以有不同的状态。
所以需要设计一个动态状态机,其实思路很简单,就是需要一个决策对象来判断当前进入哪个状态类型的子状态实例。

动态状态机

状态机配置资源

5、UI框架设计

设计思想:
由UIManager来管理UI的生命周期,包括打开UI,UI栈,UI关闭等。尽可能实现UI逻辑代码与表现的分离。

描述:

  • UIManager: 负责管理UI的生命周期,UI栈,UI关闭等直接调用接口提供。
    UISysterm:挂载在UI预制体上,是UI逻辑和UI预制体的桥梁,主要由UIManager持有进行管理。
  • UILogicBase: 是UI脚本逻辑,与预制体分离。这样不同的UILogicBase可以是多个不同UI预制体的逻辑脚本。
  • UIDef: 用于静态注册UILogicBase类型与对应UI预制体的映射,用于通过UIDef来打开界面。
  • UIFactory: 用于构建加载UI预制体。将UISystem和预制体以及UIBLogicBase结合起来。
  • UILayerManager: 负责UI分层控制UI生成所处的层级,同时处理UI间的渲染顺序处理。

UI框架

6、结语

上面介绍的思路和设计,都是基于本人以往经验设计开发,存在很多不足,但我会继续学习以将Demo开发完善,成为我技术成长的一个里程碑。