当前位置: 首页 > article >正文

Unity GameFramework Star Force 拆解(一)—— 启动流程

文章目录

    • 启动流程:
      • ProcedureLaunch:
      • ProcedureSplash:
      • ProcedureInitResources:
      • ProcedurePreload:
      • ProcedureChangeScene:
      • ProcedureMenu:
      • ProcedureMain:

首先,我是个菜鸡,其次,这是我第一次了解GameFramework,这也是我打算写这篇文章的目的,我希望从头到尾了解一遍GameFramework,通过这个小Demo来进一步了解框架和制作流程,这样我就可以做个大Demo了()

万事开头难,先从整体框架来看,这是最简单的,因为每个教你这个框架的人开头都会说,并且都是一样的

这个框架虽然几年没更新,但实际本身已经非常完善,虽然我还没学,不过听说做的很漂亮规范,对于初学者而言,也是一个非常值得学习的开源框架。

启动流程:

GameFrameworkComponent 在 Awake 中向静态类 GameEntry 注册自己(所有组件都放在场景中的预制体里了)

StarForce.GameEntry 在 Start 中将所有已注册的组件缓存到自己身上的静态字段中(方便本项目内的类使用)

GameEntry被分成了三份,Builtin负责缓存框架组件到自身,Custom负责缓存自定义组件到自身,而这两个初始化操作在什么后缀都没有的GameEntry的那份使用Monobehavior的Start函数进行调用

接下来是Procedure的逐步初始化。GameFramework将游戏的整个流程拆解成有限状态机,使得流程明确,逻辑得以分散,即方便阅读,也方便理解。

GameFramework会自动在视图更新所有继承自ProcedureBase的类,因此我们自己继承一个后也会被显示上去。设定哪个流程是开始流程的选项,只需要选择对应的类即可,就像枚举一样。

首先是在场景中的Procedure中就配置的ProcedureLaunch,一切从该状态开始

ProcedureLaunch:

第一步先初始化BuildinData,虽然叫Buildin,不过这个是一个Custom组件,放在了场景中GameFramework的Custom下。这个数据应该是用来进行资源热更新用的,其内部记录了版本号,检查版本和各个平台的资源获取路径。初始化就是将在场景中拖动到该组件上的版本文本资源给解释成C#类,不然代码没法读取其数据

第二步是进行语言的配置,首先从GameEntry.Localization中拿出language,然后将其赋值为GameEntry.Setting中存储的Language(当然是在有的前提下),之后对语言进行,检查,是不支持的语言就默认改成英语,这个操作同样要再同步回GameEntry.Setting

第三步是加载资源包变体,GameFramework不仅允许字体的本地化,同时还支援了资源包的本地化,即不同的语言对应了不同的资源包,更加的自由哇!!!这里是调用GameEntry.Resource的SetCurrentVariant来加载对应变体。

第四步比较简单,是初始化设置音量,直接挨个读取GameEntry.Setting的值,然后设置进GameEntry.Sound就行

ProcedureSplash:

这个状态看了下,说是可以放个闪屏动画,不过通过流程可以看出来,这个是用于分支的状态,在这之后,程序会按照设置走向编辑器,单机,可更新三种状态的其中一个。除了分流外什么也没干

编辑器模式直接走向ProcedurePreload,可更新和单机走向ProcedureCheckVersion和ProcedureInitResources两个不同状态,其中可更新会走向一个很长的更新流程(就是一般资源热更新该做的所有事情),而单机会在下一个状态走向ProcedurePreload,因此现在先忽略可更新,看一下ProcedureInitResources和ProcedurePreload

ProcedureInitResources:

调了俩接口,从UnityGameFrameworkComponent调到GameFrameworkComponent层去了,没下GameFramework,暂时看不到引用(),总之就是UGF层的Resource组件调了个InitResource。

ProcedurePreload:

预加载加载了四大东西:Config,DataTable,Dictionary,Font

看了下都是拼了个路径再调用对应的模块去读取这些配置文件,将其作为C#对象存在了模块中,方便后续读取

预加载结束后,设定下一个场景ID为Menu场景,接着转到下一个场景

ProcedureChangeScene:

在这一层对场景进行异步加载,如果是加载到菜单场景的,就会跳入ProcedureMenu,否则会进入ProcedureMain(扩展自己的项目的时候可以将场景ID写入全局配置使用,再在该流程进行一个切换)

ProcedureMenu:

这一层打开了MenuUI,并且向UI提供了StartGame的函数接口,用于调用,其会将开始游戏的flag设置为true,流程会立刻向后推进,加载Main地图,然后就会进入ProcedureChangeScene,接着在地图加载完后进入ProcedureMain

ProcedureMenu和MenuForm息息相关,ProcedureMenu进入会打开MenuForm,并将自己注入UI中,UI异步打开完成后会缓存ProcedureMenu的引用

同时ProcedureMenu状态离开时也会主动关闭MenuForm

ProcedureMain:

看了下,该进程主要逻辑是控制当前的游戏模式和何时切换回菜单

游戏模式的类是GameBase,其Initialize被ProcedureMain调用,包括了

  • 显示玩家飞机到默认位置
  • 获取背景图的缓存

SurvivalGame是唯一的游戏模式,继承自GameBase,在Update中新增了随机生成敌人的逻辑


http://www.kler.cn/a/371477.html

相关文章:

  • 利用游戏引擎的优势
  • 力扣21 : 合并两个有序链表
  • 【HarmonyOS】判断应用是否已安装
  • 基于单片机的废气监测系统研究与实现
  • 前端自学资料(笔记八股)分享—CSS(4)
  • 《近似线性可分支持向量机的原理推导》 拉格朗日函数 公式解析
  • 机器学习与神经网络:诺贝尔物理学奖的新方向
  • Gradle 配置后续一致更新
  • redis的三种客户端
  • SpringMVC学习(2)
  • Mac开发环境配置- Shell/Homebrew/ruby
  • ele-table表格列表内,双击编辑部分信息(el-table组件同理)
  • C# OpenCvSharp DNN UNet 推理
  • 华为手机系统应用瘦身
  • 了解桌面机床用于学校教学培训应用-桌面级CNC机床
  • Debug日程工作经验总结日程常用
  • 五指cms安装
  • ubuntu20.04系统安装
  • 使用Python和OpenCV实现火焰检测
  • c++ assert
  • [机器学习]集成学习
  • Docker架构
  • [论文阅读]SimCSE: Simple Contrastive Learning of Sentence Embeddings
  • Topaz Video AI for Mac 视频无损放大软件安装教程【保姆级,操作简单轻松上手】
  • 《ToDesk 云电脑、易腾云、青椒云移动端体验实测:让手机秒变超级电脑》
  • 鸿蒙NEXT应用上架与分发