[Game Framework之StarForce解读]02.游戏入口

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/musicvs/article/details/79461025

本文 Game Framework 版本:3.1.0

本文 Unity3D 版本:2017.3

更多GF教程和实例:https://github.com/mutouzdl/gameframework_demo.git

 

转载请注明,原文地址:http://www.benmutou.com/archives/2486
文章来源:笨木头与游戏开发

1.入口

游戏的入口很容易找,我才找了半天就找到了,就在这:

GameEntry很简单,只在Start的时候执行了两个初始化函数:

/// <summary>
/// 游戏入口。
/// </summary>
public partial class GameEntry : MonoBehaviour
{
    private void Start()
    {
        InitBuiltinComponents();
        InitCustomComponents();
    }
}

InitBuiltinComponents:初始化框架自带的基础组件;

InitCustomComponents:初始化我们自己的组件。

(另外一提,GameEntry类拆分为三个文件了,别以为只有上面那一点点代码)

 

2.InitBuiltinComponents

我重点要说的是InitBuiltinComponents,这个函数里对框架的所有基础组件进行了初始化,具体如何初始化的,不在本篇文章的范围内(旁白:当然了,因为他自己也不懂)

什么?你们非要我贴代码凑字数?好吧好吧,这个函数长这样:

private static void InitBuiltinComponents()
{
    Base = UnityGameFramework.Runtime.GameEntry.GetComponent<BaseComponent>();
    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>();
    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>();
}

3.真正的入口

游戏真的入口在哪里?按照官方的介绍,流程是负责控制生命周期的,所以我理所当然地先从流程入手去找游戏入口。

但是,我到IDE去找,只找到了这个:

我找到了所谓的流程(Procedure),但是这个对象的组件(ProcedureComponent)很奇怪,对,它没有任何可以让我赋值的地方。

为什么直接就出现了一堆流程属性?

我很疑惑,所以我随便选了一个名为【ProcedureMenu】的东西,然后去代码里找,我找到了:

public class ProcedureMenu : ProcedureBase

 

接着当然是再去看看ProcedureBase是什么了,我又看到了:

它只不过是一个继承了底层ProcedureBase的类,然后我想了一件可怕的事情,作者曾经这么说过,以下是原话:

**流程 (Procedure)** – 是贯穿游戏运行时整个生命周期的有限状态机。通过流程,将不同的游戏状态进行解耦将是一个非常好的习惯。对于网络游戏,你可能需要如检查资源流程、更新资源流程、检查服务器列表流程、选择服务器流程、登录服务器流程、创建角色流程等流程,而对于单机游戏,你可能需要在游戏选择菜单流程和游戏实际玩法流程之间做切换。如果想增加流程,只要派生自 ProcedureBase 类并实现自己的流程类即可使用

(旁白:别把MarkDown的语法也拷过来啊!)

 

重点是最后一句:【如果想增加流程,只要派生自 ProcedureBase 类并实现自己的流程类即可使用】,从作者的这句话里,我们可以得知此时作者的内心活动是我的底层会自动读取继承了ProcedureBase的类“。

对,如果我没瞎猜错的话,就是这个意思。

 

所以,我们的ProcedureMenu继承了ProcedureBase,理所当然的,会出现下面这种情况:

ProcedureMenu出现在了流程组件的属性里。

至于这些流程属性前面的勾,自然是代表要不要启用这个流程(对,我瞎猜的)。

而下方的【Entrance Procedure】下拉列表,自然是选择初始执行的流程了。

至于ProcedureMenu里面做了什么事情,我们先不管,肯定就是加载菜单场景之类的。

4.创建自己的流程(就是测试一下有没有瞎猜错)

为了更加明确流程的用法,我们来测试一下,自己加一个流程。

在StarForce的Scripts目录下,随便找个目录(比如Procedure),新建一个类,内容如下:

namespace StarForce
{
  public class ProcedureTest : GameFramework.Procedure.ProcedureBase
  {
    
  }
}

名为【ProcedureTest】的类,继承了框架的ProcedureBase类。接下来,回到IDE的界面,看看神奇的事情:

看到了吗?我们新加的流程也出现在流程组件的属性里了。

5.切换场景

从上图可以看到,底部有一个【Entrance Procedure】属性,该属性是一个下拉列表,表示游戏运行时第一个执行的流程。

这个默认第一个执行的流程是【ProcedureLaunch】,这个流程涉及的内容比较多,我们就不深入了解了(旁白:没错,他的意思就是他还没看懂)。

我们只要知道,ProcedureLaunch里做了一些初始化操作,并且切换到Menu场景。

6.唠叨一下

从流程添加的这个规则里,我感受到了框架的优秀之处。

虽然只是冰山一角,但是已经能预见到这是一个扩展性很强的框架。

好了,本篇到此结束,下一篇我们开始研究ProcedureMenu。


猜你喜欢

转载自blog.csdn.net/musicvs/article/details/79461025