笨木头  2018-02-06 17:07     Unity3D,Game Framework     阅读(22508)     评论(11)
转载请注明,原文地址: http://www.benmutou.com/archives/2486
文章来源:笨木头与游戏开发
 

本文 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。
11 条评论
  • UnknowWind 2022-05-17 10:03:45

    木头可以开一个点赞功能,看到下面的好几个评论,管不住自己激动的内心,就是找不到点赞的入口
    44回复
    • 博主 笨木头 2022-05-18 09:21:27

      我答应你了,并默默地给你点了一个赞😎
      46回复
      • 五分 2022-06-14 00:00:18

        看见你出现了,于是赶紧给你点两个赞。
        5回复
        • 博主 笨木头 2022-06-16 13:39:53

          哈哈,两个赞...难道,你发现了什么
          23回复
  • 奔跑の贝多芬 2018-08-20 20:28:06

    受益匪浅
    0回复
  • houpe 2018-07-31 11:39:22

    游戏的入口很容易找,我才找了半天就找到了 ```````
    2回复
  • 杨卫振 2018-04-05 11:37:04

    博主你好,我在看这Demo的时候有一个地方有点疑惑,就是这个ProcedureComponent,它有一个m_AvailableProcedureTypeNames的数组和一个m_EntranceProcedureTypeName字段,然后在start()方法里直接就访问这里的数据了: ProcedureBase[] procedures = new ProcedureBase[m_AvailableProcedureTypeNames.Length]; 没找到它什么什么时候给这个m_AvailableProcedureTypeNames数组赋值的,但是调试的时候这里确实有7个数据。。。望解惑,感激不尽
    0回复
    • Ron 2018-04-05 11:55:21

      嗯嗯,底层编辑器类 ProcedureComponentInspector 通过反射获取ProcedureBase所有子类信息。上面提到的数组也可以获得的。
      0回复
    • Ron1 2018-04-05 11:55:36

      嗯嗯,底层编辑器类 ProcedureComponentInspector 通过反射获取ProcedureBase所有子类信息。上面提到的数组也可以获得的。
      0回复
  • Ron 2018-03-09 09:57:25

    嗯嗯,底层编辑器类 ProcedureComponentInspector 通过反射获取ProcedureBase所有子类信息。并绘制到Inspector上。
    1回复
    • 博主 笨木头 2018-03-09 13:26:02

      谢谢分享( •̀ ω •́ )y
      0回复
发表评论
粤ICP备16043700号

本博客基于 BlazorAnt Design Blazor 开发