StartForce学习1(ProcedureMenu)
入口
在 Start 执行了两行函数
/// <summary>
/// 游戏入口。
/// </summary>
public partial class GameEntry
{
private void Start()
{
InitBuiltinComponents(); //初始化框架自带的基础组件
InitCustomComponents(); //初始化自己的组件
}
}
ProcedureMemu
根据官方文档整个游戏的流程因该都是由流程 (Procedure) 控制的。
于是就找到了这个
根据作者在流程介绍中所说 “如果想增加流程,只要派生自 ProcedureBase 类并实现自己的流程类即可使用。”,所以我们这里面所显示的流程因该都是继承与 ProcedureBase 的脚本
通过脚本名,我们进 ProcedureMenu 看到脚本重写了 OnEnter、OnLeave、OnUpdate
通过继承我们找到 ProcedureBase 脚本可以看到他们的调用时机(OS:着看函数名也知道吧…)
回到 ProcedureMemu
- OnEnter:
- (GameEntry.Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OnOpenUIFormSuccess)):订阅事件,从代码看作者对不同的事件进行了封装,如 OpenUIFormSuccessEventArgs(打开界面成功事件)。
- (m_StartGame = false;):开始游戏设置为 false
- (GameEntry.UI.OpenUIForm(UIFormId.MenuForm, this)):打开 UI 菜单,传入一个 UIFormId 和 UserData
- UIFormId : 打开 UI 传入一个界面编号,这里只是把枚举值转换成 int 而已
- UserDate :在 UI 成功打开时,会触发 UI 事件(OpenUIFormSuccessEventArgs),它会传一个数据回来,就是我们在 OpenUIForm 时传入的 UserData
protected override void OnEnter(ProcedureOwner procedureOwner) { base.OnEnter(procedureOwner); GameEntry.Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OnOpenUIFormSuccess); m_StartGame = false; GameEntry.UI.OpenUIForm(UIFormId.MenuForm, this); }
- OnUpdate:只做了一件事,在开始游戏的时候切换到 Main 场景,根据作者注释,因该是使用有限状态机去切换不同的流程状态,然后不同的流程去干不同的事情
protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds) { base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds); if (m_StartGame) { procedureOwner.SetData<VarInt32>("NextSceneId", GameEntry.Config.GetInt("Scene.Main")); procedureOwner.SetData<VarByte>("GameMode", (byte)GameMode.Survival); ChangeState<ProcedureChangeScene>(procedureOwner); } }
- OnOpenUIFormSuccess:
在 OnEnter 订阅事件的回调,e 事件发生时传递回来的数据,其中就包含了我们刚刚传入的 userData 。
给 m_MenuForm 赋值,暂时不明白 UIForm.Logic 是什么数据//TODOprivate void OnOpenUIFormSuccess(object sender, GameEventArgs e) { OpenUIFormSuccessEventArgs ne = (OpenUIFormSuccessEventArgs)e; if (ne.UserData != this) { return; } m_MenuForm = (MenuForm)ne.UIForm.Logic; }
- 总结:总览一下 ProcedureMenu 在进入时增加一个事件 -> 等事件成功 -> 在 Update 切换状态到 ProcedureChangeScene