StartForce学习1(ProcedureMenu)

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

  1. 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);
    }
    
    
  2. 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);
     	}
     }
    
  3. OnOpenUIFormSuccess:
    在 OnEnter 订阅事件的回调,e 事件发生时传递回来的数据,其中就包含了我们刚刚传入的 userData 。
    给 m_MenuForm 赋值,暂时不明白 UIForm.Logic 是什么数据//TODO
    private void OnOpenUIFormSuccess(object sender, GameEventArgs e)
     {
     	OpenUIFormSuccessEventArgs ne = (OpenUIFormSuccessEventArgs)e;
     	if (ne.UserData != this)
     	{
     		return;
     	}
    
     	m_MenuForm = (MenuForm)ne.UIForm.Logic;
     }
    
  • 总结:总览一下 ProcedureMenu 在进入时增加一个事件 -> 等事件成功 -> 在 Update 切换状态到 ProcedureChangeScene
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值