本文 Game Framework 版本:3.1.0
本文 Unity3D 版本:2017.3
更多GF教程和实例:https://github.com/mutouzdl/gameframework_demo.git
转载请注明,原文地址:http://www.benmutou.com/archives/2486
文章来源:笨木头与游戏开发
游戏的入口很容易找,我才找了半天就找到了,就在这:
GameEntry很简单,只在Start的时候执行了两个初始化函数:
///
/// 游戏入口。
///
public partial class GameEntry : MonoBehaviour
{
private void Start()
{
InitBuiltinComponents();
InitCustomComponents();
}
}
InitBuiltinComponents:初始化框架自带的基础组件;
InitCustomComponents:初始化我们自己的组件。
(另外一提,GameEntry类拆分为三个文件了,别以为只有上面那一点点代码)
我重点要说的是InitBuiltinComponents,这个函数里对框架的所有基础组件进行了初始化,具体如何初始化的,不在本篇文章的范围内(旁白:当然了,因为他自己也不懂)
什么?你们非要我贴代码凑字数?好吧好吧,这个函数长这样:
private static void InitBuiltinComponents()
{
Base = UnityGameFramework.Runtime.GameEntry.GetComponent();
DataNode = UnityGameFramework.Runtime.GameEntry.GetComponent();
DataTable = UnityGameFramework.Runtime.GameEntry.GetComponent();
Debugger = UnityGameFramework.Runtime.GameEntry.GetComponent();
Download = UnityGameFramework.Runtime.GameEntry.GetComponent();
Entity = UnityGameFramework.Runtime.GameEntry.GetComponent();
Event = UnityGameFramework.Runtime.GameEntry.GetComponent();
Fsm = UnityGameFramework.Runtime.GameEntry.GetComponent();
Localization = UnityGameFramework.Runtime.GameEntry.GetComponent();
Network = UnityGameFramework.Runtime.GameEntry.GetComponent();
ObjectPool = UnityGameFramework.Runtime.GameEntry.GetComponent();
Procedure = UnityGameFramework.Runtime.GameEntry.GetComponent();
Resource = UnityGameFramework.Runtime.GameEntry.GetComponent();
Scene = UnityGameFramework.Runtime.GameEntry.GetComponent();
Setting = UnityGameFramework.Runtime.GameEntry.GetComponent();
Sound = UnityGameFramework.Runtime.GameEntry.GetComponent();
UI = UnityGameFramework.Runtime.GameEntry.GetComponent();
WebRequest = UnityGameFramework.Runtime.GameEntry.GetComponent();
}
3.真正的入口
游戏真的入口在哪里?按照官方的介绍,流程是负责控制生命周期的,所以我理所当然地先从流程入手去找游戏入口。
但是,我到IDE去找,只找到了这个:
我找到了所谓的流程(Procedure),但是这个对象的组件(ProcedureComponent)很奇怪,对,它没有任何可以让我赋值的地方。
为什么直接就出现了一堆流程属性?
我很疑惑,所以我随便选了一个名为【ProcedureMenu】的东西,然后去代码里找,我找到了:
public class ProcedureMenu : ProcedureBase
接着当然是再去看看ProcedureBase是什么了,我又看到了:
它只不过是一个继承了底层ProcedureBase的类,然后我想了一件可怕的事情,作者曾经这么说过,以下是原话:
**流程 (Procedure)** – 是贯穿游戏运行时整个生命周期的有限状态机。通过流程,将不同的游戏状态进行解耦将是一个非常好的习惯。对于网络游戏,你可能需要如检查资源流程、更新资源流程、检查服务器列表流程、选择服务器流程、登录服务器流程、创建角色流程等流程,而对于单机游戏,你可能需要在游戏选择菜单流程和游戏实际玩法流程之间做切换。如果想增加流程,只要派生自 ProcedureBase 类并实现自己的流程类即可使用。
(旁白:别把MarkDown的语法也拷过来啊!)
重点是最后一句:【如果想增加流程,只要派生自 ProcedureBase 类并实现自己的流程类即可使用】,从作者的这句话里,我们可以得知此时作者的内心活动是…“我的底层会自动读取继承了ProcedureBase的类“。
对,如果我没瞎猜错的话,就是这个意思。
所以,我们的ProcedureMenu继承了ProcedureBase,理所当然的,会出现下面这种情况:
ProcedureMenu出现在了流程组件的属性里。
至于这些流程属性前面的勾,自然是代表要不要启用这个流程(对,我瞎猜的)。
而下方的【Entrance Procedure】下拉列表,自然是选择初始执行的流程了。
至于ProcedureMenu里面做了什么事情,我们先不管,肯定就是加载菜单场景之类的。
为了更加明确流程的用法,我们来测试一下,自己加一个流程。
在StarForce的Scripts目录下,随便找个目录(比如Procedure),新建一个类,内容如下:
namespace StarForce
{
public class ProcedureTest : GameFramework.Procedure.ProcedureBase
{
}
}
看到了吗?我们新加的流程也出现在流程组件的属性里了。
从上图可以看到,底部有一个【Entrance Procedure】属性,该属性是一个下拉列表,表示游戏运行时第一个执行的流程。
这个默认第一个执行的流程是【ProcedureLaunch】,这个流程涉及的内容比较多,我们就不深入了解了(旁白:没错,他的意思就是他还没看懂)。
我们只要知道,ProcedureLaunch里做了一些初始化操作,并且切换到Menu场景。
从流程添加的这个规则里,我感受到了框架的优秀之处。
虽然只是冰山一角,但是已经能预见到这是一个扩展性很强的框架。
好了,本篇到此结束,下一篇我们开始研究ProcedureMenu。