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.rhkb.cn/news/462097.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang | Leetcode Golang题解之第525题连续数组

题目: 题解: func findMaxLength(nums []int) (maxLength int) {mp : map[int]int{0: -1}counter : 0for i, num : range nums {if num 1 {counter} else {counter--}if prevIndex, has : mp[counter]; has {maxLength max(maxLength, i-prevIndex)} …

ML2001-1 机器学习/深度学习 Introduction of Machine / Deep Learning

图片说明来自李宏毅老师视频的学习笔记,如有侵权,请通知下架 影片参考 【李宏毅】3.第一节 - (上) - 机器学习基本概念简介_哔哩哔哩_bilibili 1. 机器学习的概念与任务类型 概念:机器学习近似于寻找函数,用于处理不同类型的任…

打响反对人工智能的第一枪

序言:人工智能的讨论不能只有一片叫好的声音,一味的追捧反而可能隐藏巨大的危机。因此,必须有反对的声音,且越强烈越能激发深入思考。本篇文章的作者就以犀利的视角,漂亮地打响了反对人工智能应用的第一枪。 我以前一…

ubuntu运行gazebo导致内存越来越少

1.用vscode看代码会一直有没用的日志缓存,可以删掉(文件夹留着,可以把里面的东西删掉) 2.运行gazebo的模型会有很多缓存文件,可以删掉 log文件夹非常大

动态规划之两个数组的 dp(上)

文章目录 最长公共子序列不相交的线不同的子序列通配符匹配 最长公共子序列 题目:最长公共子序列 思路 选取s1的[0, i]区间以及s2的[0, j]区间作为研究对象 状态表示:dp[i][j]表示,s1的[0, i]区间以及s2的[0, j]区间内…

中仕公考:25年上海省考时间

打算参加2025年上海省考的考生,中仕公考为大家整理了24年的考试时间点做参考。 报名时间:11月4日-11月10日 缴费时间:11月4日-11月11日 准考证打印时间:12月6日-12月9日 笔试时间:12月10日 9:00-11:30申论 13:30-15:30行政职业能力测验 16:15-17:15专业科目 …

智能指针(内存泄漏问题)

🌻个人主页:路飞雪吖~ 🌠专栏:C/C 目录 一、为什么需要智能指针? 二、内存泄露 三、智能指针的使用及原理 ⭐RAII ⭐智能指针的原理 🌠小贴士: ⭐std::auto_ptr ​编辑 ✨auto_ptr模拟实…

CSS例子: 横向排列的格子

效果 HTML <view class"content"><view class"item" v-for"item of 5">{{item}}</view></view> CSS .content {height: 100vh;display: flex;flex-direction: row; flex-wrap: wrap;align-content: flex-start;backgro…

面试题分享1

2024.11.1 1、过滤器和拦截器的区别 过滤器是基于spring的 拦截器是基于Java Web的 2、session 和 cookie 的区别、关系 cookie session 存储位置 保存在浏览器 &#xff08;客户端&#xff09; 保存在服务器 存储数据大小 限制大小&#xff0c;存储数据约为4KB 不限…

Python酷库之旅-第三方库Pandas(186)

目录 一、用法精讲 861、pandas.Index.names属性 861-1、语法 861-2、参数 861-3、功能 861-4、返回值 861-5、说明 861-6、用法 861-6-1、数据准备 861-6-2、代码示例 861-6-3、结果输出 862、pandas.Index.nbytes属性 862-1、语法 862-2、参数 862-3、功能 8…

Ansible 部署应用

Ansible Ansible 是基于 Python 开发&#xff0c;集合了众多优秀运维工具的优点&#xff0c;实现了批量运行命令、部署程序、配置系统等功能的自动化运维管理工具。默认通过 SSH 协议进行远程命令执行或下发配置&#xff0c;无需部署任何客户端代理软件&#xff0c;从而使得自动…

Python的全局锁GIL解析

Python的全局锁&#xff08;GIL&#xff09;是 CPython 解释器实现中的一个机制&#xff0c;用来确保任何时候只有一个线程执行 Python 字节码。这一机制存在于 CPython 中&#xff0c;主要是为了确保线程操作中的数据一致性&#xff0c;但也因此限制了多线程的并行执行效率。尤…

基于vue框架的的考研信息共享平台v0eyp(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;国家政策,用户,院校政策,院校信息,考研资料,资料分类,考研论坛 开题报告内容 基于Vue框架的考研信息共享平台开题报告 一、研究背景与意义 随着考研人数的逐年增长&#xff0c;考研学生对高效、便捷、个性化的信息获取需求愈发强烈。…

抽丝剥茧 分布式服务框架设计 理论设计篇

1、概述 前面几篇文章给大家详细的介绍了Zookeeper的基础概念以及应用的领域&#xff0c;今天我们讨论的话题是如何自研一套分布式服务框架。早些年有很多基于Dubbo和Zookeeper的分布式系统&#xff0c;这篇文章我们就来聊下如何设计一个分布式服务框架。 2、系统间交互 2.1、…

C++STL——list

C教学总目录 list 1、list简介2、构造函数3、迭代器4、访问和容量函数5、修改类函数6、操作类函数 1、list简介 list是带头双向循环链表&#xff0c;也是模板类&#xff0c;使用时要指明类型&#xff0c;包含于头文件<list> 由于list是双向循环链表&#xff0c;在任意位置…

YoloV8改进策略:Block改进|RFE模块,提高小物体的识别精度|即插即用|代码+修改过程

摘要 论文介绍 本文介绍了一种基于YOLOv5的人脸检测方法,命名为YOLO-FaceV2。该方法旨在解决人脸检测中的尺度变化、简单与困难样本不平衡以及人脸遮挡等问题。通过引入一系列创新模块和损失函数,YOLO-FaceV2在WiderFace数据集上取得了优异的表现,特别是在小物体、遮挡和困…

leaflet矢量瓦片vetorgrid显示聚合和图标裁剪显示不全的问题

1、问题现象 使用leaflet显示矢量瓦片会出现图片挤压的问题和图片裁剪显示不全的问题 2、解决办法和思路 1&#xff09;数据抽稀 方法一&#xff1a;在createTile方法通过控制feature在单张瓦片里面显示的数量&#xff0c;在小层级的时候进行筛选过滤&#xff0c;对点数据类…

Gitee push 文件

1、背景 想将自己的plecs仿真放到git中管理&#xff0c;以防丢失&#xff0c;以防乱改之后丢失之前版本仿真。此操作说明默认用户已下载git。 2、操作步骤 2.1 开启Git Bash 在文件夹中右键&#xff0c;开启Git Bash。 2.2 克隆文件 在Git Bash中打git clone git地址&#…

gitee 使用 webhoot 触发 Jenkins 自动构建

一、插件下载和配置 Manage Jenkins>Plugin Manager 搜索 gitee 进行安装 插件配置 1、前往Jenkins -> Manage Jenkins -> System -> Gitee Configuration -> Gitee connections 2、在 Connection name 中输入 Gitee 或者你想要的名字 3、Gitee host URL 中…

【JavaEE初阶 — 多线程】Thread类的属性

目录 Thread类的属性 1.Thread 的常见构造方法 2.Thread 的几个常见属性 2.1 前台线程与后台线程 2.2 setDaemon() 2.3 isAlive() Thread类的属性 Thread 类是JVM 用来管理线程的一个类&#xff0c;换句话说&#xff0c;每个线程都有一个唯一的Thread 对象与之关联&…