IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity技术-GameFramework-官方案例解析 -> 正文阅读

[游戏开发]Unity技术-GameFramework-官方案例解析

轻轻的我走了,正如我轻轻的来;我轻轻的补刀,和对面抢先到二。

往期文章分享

本文约7.6千字,新手阅读需要18分钟,复习需要9分钟收藏随时查阅不再迷路

👉关于作者

众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣 !!!
专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
有什么需要欢迎私我,交流群让学习不再孤单

在这里插入图片描述

👉前提

学习框架查看官方的文档或案例是很快的学习方式。

咱们刚刚学习了Game Framework框架,没有个案例怎么能行呢;虽然官方就有个完成的案例,但是吧,作者大佬经常“鸽”,没有什么官方教程。

不过没关系我们就来一起看看

👉实践过程

😜下载项目

在本地创建个文件夹,利用git下载项目(推荐)

git clone https://gitee.com/jiangyin/StarForce.git
使用Unity打开工程,我的是Unity2019.4.9f1版本,打开可能有点慢,不急,等一等。
image.png
进去后运行StarForce Launcher,即可开始游戏。(可能出现不同Unity版本打开的时候脚本里面的API或者什么有报错,自己对应修改下就行了)
image.png

😜寻找入口

任何一款游戏入口是第一印象,程序入口是开发的切入口。案例的入口找起来也很快,有个StarForce Launcher的场景,点进去发现只有个Game Framework的物体,挂载着【GameEntry】脚本,拿这个脚本必定是入口了,点进去看看。
image.png
发现里面只有两个函数方法;这么简单?点进去看看;

private static void InitBuiltinComponents()
{
    Base = UnityGameFramework.Runtime.GameEntry.GetComponent<BaseComponent>();
    Config = UnityGameFramework.Runtime.GameEntry.GetComponent<ConfigComponent>();
    DataNode = UnityGameFramework.Runtime.GameEntry.GetComponent<DataNodeComponent>();
    DataTable = UnityGameFramework.Runtime.GameEntry.GetComponent<DataTableComponent>();
    Debugger = UnityGameFramework.Runtime.GameEntry.GetComponent<DebuggerComponent>();
    Download = UnityGameFramework.Runtime.GameEntry.GetComponent<DownloadComponent>();
    Entity = UnityGameFramework.Runtime.GameEntry.GetComponent<EntityComponent>();
    Event = UnityGameFramework.Runtime.GameEntry.GetComponent<EventComponent>();
    FileSystem = UnityGameFramework.Runtime.GameEntry.GetComponent<FileSystemComponent>();
    Fsm = UnityGameFramework.Runtime.GameEntry.GetComponent<FsmComponent>();
    Localization =  UnityGameFramework.Runtime.GameEntry.GetComponent<LocalizationComponent>();
    Network = UnityGameFramework.Runtime.GameEntry.GetComponent<NetworkComponent>();
    ObjectPool = UnityGameFramework.Runtime.GameEntry.GetComponent<ObjectPoolComponent>();
    Procedure = UnityGameFramework.Runtime.GameEntry.GetComponent<ProcedureComponent>();
    Resource = UnityGameFramework.Runtime.GameEntry.GetComponent<ResourceComponent>();
    Scene = UnityGameFramework.Runtime.GameEntry.GetComponent<SceneComponent>();
    Setting = UnityGameFramework.Runtime.GameEntry.GetComponent<SettingComponent>();
    Sound = UnityGameFramework.Runtime.GameEntry.GetComponent<SoundComponent>();
    UI = UnityGameFramework.Runtime.GameEntry.GetComponent<UIComponent>();
    WebRequest = UnityGameFramework.Runtime.GameEntry.GetComponent<WebRequestComponent>();
}

InitBuiltinComponents()-光看名字就知道初始化内置组件,另一个就是初始化自定义的组件了。

等等,好像哪里不对!怎么感觉是不同的文件?
image.png
GameEntry竟然有三个类,我哩个去,挺6的啊。仔细看,原来是partial class作祟。

partial class是部分类关键字,什么是部分类?就是将一个类的代码根据不同的内容逻辑划分开,然后写在不同的文件中,这样有利于多位开发人员同时对该类处理,既增强可读性又实用。而且命名的时候最好也规范化,比如主部分类文件名为AClass,次部分类就为AClass.PartName。

image.png

Partial 关键字还有几点注意

  • 1.所有部分类都要使用partial关键字
  • 2.各个部分访问权限要一致,是public就都是public,是其他的就都是其他的
  • 3.其中任意一个声明抽象类型,整个类型都会是抽象的
  • 4.她们内部的任何类,结构等是可以相互使用的

😜真假入口?

之前的文章中找到个初步入口代码发现就走不动了,这不对啊,按道理讲找到入口就应该层层递进分析透彻,唰唰唰咔咔咔的打通奇经八脉。卡在这可不甘心啊。我又在官方看介绍,发现官方有个流程一说,她就像人的大脑心脏一样,有条不絮的管理整个身体。

官方案例中确实也有个流程(procedure)的物体,那我们就一探究竟,看看到底是不是真正的入口。
image.png
这个流程组件,从直观上来看只是提供了勾选功能,没有其他功能,那这“玄乎”的内容里面到底做了什么呢?

我们先随便找到个流程文件看看,发现她是继承自【ProcedureBase】类的,我们再反过来去看看框架作者说的话(仔细去品味一下):

流程是贯穿游戏运行时整个生命周期的有限状态机。通过流程,将不同的游戏状态进行解耦将是一个非常好的习惯。

对于一款网络游戏来说,你可能需要如下几个流程:检查资源流程、更新资源流程、检查服务器列表流程、选择服务器流程、登录服务器流程、创建角色流程等流程,而对于单机游戏,你可能需要在游戏选择菜单流程和游戏实际玩法流程之间做切换。

所以,如果想增加流程,只要派生自【ProcedureBase】类并实现自己的流程类即可使用。

从最后一句话我们可以看出,每个流程只要继承【ProcedureBase】框架就会自动读取,然后在上图中显示出来。还有【Entrance Procedure】翻译过来就是入口,应该是从各个流程中选择一个启动流程入口。

有兴趣的也可以测试下自定义类继承【ProcedureBase】,看是否会在这出现。

事实是会的。

😜流程分析

既然从入口处知道了流程贯穿整个过程,那我们倒要看看这个流程到底有什么能耐。
image.png
从上图代码和注释看出,流程也是有生命周期函数的,至于对应的里面都做什么我们马上打开看看,但我们要先理清两点

  • 1.框架是用流程来管理所有事情,不同流程负责不同工作,就像生产线一样
  • 2.流程的切换是用有限状态机来实现的

OnInit】方法,凡是Init初始化方法,在编程里不成文的规定-都是最先执行的。事实此框架也是这么干的。

OnEnter】方法,这里面有个GameMode-游戏模式,和LOL的匹配,大乱斗,无限火力一样的思想,模式不同,里面的玩法内容不同。里面是【m_CurrentGame.Initialize();】初始化的,而【CurrentGame】是【GameBase】类型,我们就看看【GameBase】她是怎么初始化的。进去发现她不是框架的一部分,那必然是根据各自的开发项目不同自己定义。

初始化方法【Initialize】里面出了注册Event事件外,就是创建玩家【ShowMyAircraft】,我们层层剖析发现【ShowMyAircraft】最终是调用【ShowEntity】,这个里面又有两大方法:读取配置文件和加载实体配置【暂不剖析】。

接着我们在回去看看【OnInit】里面初始化了个【SurvivalGame】,而这个是继承自【GameBase】,

GameBase】是基础游戏类,那继承自她的【SurvivalGame】就应该是实际游戏的实现了。

看看【SurvivalGame】里的方法-只有个【Update】,且里面是每秒创建一个怪物,随机坐标,然后加载出来。
image.png
那么我们整体回顾下流程

  1. OnInit初始化游戏模式,而游戏模式类里面有具体的业务代码
  2. OnEnter初始化游戏相关,并且利用从配置文件读取数据,根据数据来加载实体创建玩家,还有启用OnInit里面初始化的代码。
  3. OnUpdate切换不同的流程
  4. onLeave,离开当前流程的时候释放资源,比如取消订阅事件,关闭菜单UI

😜真实的逻辑处理

前面说了部分还是理解的模模糊糊,可以看木头前辈的文章,在这咱说清楚真正的逻辑处理在哪
image.png
我们进去可以看到有【OnInit】【OnShow】【OnUpdate】三个方法,【OnUpdate】中就包含 了事件逻辑处理等
image.png
到这基本思路就渐渐清晰了,至于更深入的学习,后面需要的时候再挖坑吧。

👉其他

📢作者:小空和小芝中的小空
📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
📢欢迎点赞👍收藏🌟留言📝

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-01-28 12:15:50  更:2022-01-28 12:16:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 18:29:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码