001,LuaFramework基本流程

启动顺序

  1. Main.cs绑定到场景的一个组件上

    1 public class Main : MonoBehaviour { 2 void Start() { 3 AppFacade.Instance.StartUp(); //启动游戏 4 } 5 }
  2. StartUpCommand的Execute函数开始初始化必要的东西

    1 public class StartUpCommand : ControllerCommand 2 { 3 public override void Execute(IMessage message) 4 { 5 //首先检查运行环境,这个函数只在UNITY_EDITOR下有用 6 //其他时候都是直接返回true的 7 if (!Util.CheckEnvironment()) return; 8 9 //如果需要显示AppView信息,需要在场景上添加GlobalGenerator对象 10 //AppView里面只是显示一些消息 11 GameObject gameMgr = GameObject.Find("GlobalGenerator"); 12 if (gameMgr != null) 13 { 14 AppView appView = gameMgr.AddComponent<AppView>(); 15 } 16 //-----------------关联命令----------------------- 17 //SocketCommand处理网关相关指令 18 AppFacade.Instance.RegisterCommand(NotiConst.DISPATCH_MESSAGE, typeof(SocketCommand)); 19 20 //-----------------初始化管理器----------------------- 21 AppFacade.Instance.AddManager<LuaManager>(ManagerName.Lua); 22 AppFacade.Instance.AddManager<PanelManager>(ManagerName.Panel); 23 AppFacade.Instance.AddManager<SoundManager>(ManagerName.Sound); 24 AppFacade.Instance.AddManager<TimerManager>(ManagerName.Timer); 25 AppFacade.Instance.AddManager<NetworkManager>(ManagerName.Network); 26 AppFacade.Instance.AddManager<ResourceManager>(ManagerName.Resource); 27 AppFacade.Instance.AddManager<ThreadManager>(ManagerName.Thread); 28 AppFacade.Instance.AddManager<ObjectPoolManager>(ManagerName.ObjectPool); 29 //游戏下载资源,解包都在GameManager内完成 30 //GameManager可能要在其他Manager添加后再添加 31 //这个还不能确定,刚看代码 32 AppFacade.Instance.AddManager<GameManager>(ManagerName.Game); 33 } 34 }
  3. GameManager首先完成资源的加载和释放(资源都是打包的,需要释放到Util.DataPath目录)

    1 /// 释放资源 2 public void CheckExtractResource() { 3 bool isExists = Directory.Exists(Util.DataPath) && 4 Directory.Exists(Util.DataPath + "lua/") && File.Exists(Util.DataPath + "files.txt"); 5 if (isExists || AppConst.DebugMode) { 6 StartCoroutine(OnUpdateResource()); 7 return; //文件已经解压过了,自己可添加检查文件列表逻辑 8 } 9 StartCoroutine(OnExtractResource()); //启动释放协成 10 }

    资源释放后需要下载更新资源,OnUpdateResource函数会完成这个工作
    资源初始化结束后,OnInitialize函数开始初始化游戏内容的东西

    1 void OnInitialize() 2 { 3 //这里还应该有其他的东西需要设置 4 //要根据游戏的开发后期再加 5 LuaManager.InitStart(); 6 LuaManager.DoFile("Logic/Game"); //加载游戏 7 LuaManager.DoFile("Logic/Network"); //加载网络 8 NetManager.OnInit(); //初始化网络 9 //初始化完成,调用lua脚本里面的OnInitOK方法 10 //游戏进入正常循环 11 Util.CallMethod("Game", "OnInitOK"); //初始化完成 12 13 initialize = true; 14 }
  4. Game.lua的OnInitOK函数开始真正执行lua代码,后续的游戏流程就可以交给lua代码了

    1 function Game.OnInitOK() 2 --网络连接,这里只是举例,如果是登录平台,可能要先调用平台的SDK 3 AppConst.SocketPort = 2012; 4 AppConst.SocketAddress = "127.0.0.1"; 5 networkMgr:SendConnect(); 6 7 --注册LuaView 8 this.InitViewPanels(); 9 10 CtrlManager.Init(); 11 end

    InitViewPanels函数会载入PanelNames内的所有View视图,PanelNames在define.lua里面定义
    InitViewPanels函数的内容

    1 function Game.InitViewPanels() 2 for i = 1, #PanelNames do 3 require ("View/"..tostring(PanelNames[i])) 4 end 5 end

    PanelNames里面的内容

    1 PanelNames = { 2 "PromptPanel", 3 "MessagePanel", 4 }

    CtrlManager.Init()初始化函数会初始化控制器列表

    1 function CtrlManager.Init() 2 logWarn("CtrlManager.Init----->>>"); 3 ctrlList[CtrlNames.Prompt] = PromptCtrl.New(); 4 ctrlList[CtrlNames.Message] = MessageCtrl.New(); 5 return this; 6 end
  5. 对于每一个视图都有一个Controller与之对应,Controller负责创建和维护View
    Controller的Awake方法通过panelMgr的CreatePanel方法创建对象,panelMgr在define.lua里面初始化
    panelMgr是框架的Manager里面的一个管理器,实现在PanelManager.cs文件里面

    1 public void CreatePanel(string name, LuaFunction func = null) 2 { 3 //这里会生成View的具体名称,比如PromptPanel 4 string assetName = name + "Panel"; 5 6 //这个是打包的资源的名字,比如prompt.unity3d 7 //具体打包包含什么东西,可以看同名的manifest文件,比如prompt.unity3d.manifest 8 string abName = name.ToLower() + AppConst.ExtName; 9 10 //如果已经存在,不需要再创建 11 if (Parent.Find(name) != null) return; 12 13 //获取预制体 14 GameObject prefab = ResManager.LoadAsset<GameObject>(name, assetName); 15 if (prefab == null) return; 16 17 //创建对象 18 GameObject go = Instantiate(prefab) as GameObject; 19 go.name = assetName; 20 go.layer = LayerMask.NameToLayer("Default"); 21 go.transform.SetParent(Parent); 22 go.transform.localScale = Vector3.one; 23 go.transform.localPosition = Vector3.zero; 24 //绑定LuaBehaviour,实现Unity消息到Lua里面的调用 25 go.AddComponent<LuaBehaviour>(); 26 27 //如果有回调函数,调用回调函数 28 if (func != null) func.Call(go); 29 }

    关于LuaBehaviour类 LuaBehaviour类主要实现Unity消息到Lua的调用

    1 protected void Awake() { 2 //最终lua方法的调用是通过Module.Function的形式实现的 3 //例如PromptPanel.Awake 4 Util.CallMethod(name, "Awake", gameObject); 5 } 6 7 protected void Start() { 8 Util.CallMethod(name, "Start"); 9 } 10 11 protected void OnClick() { 12 Util.CallMethod(name, "OnClick"); 13 } 14 15 protected void OnClickEvent(GameObject go) { 16 Util.CallMethod(name, "OnClick", go); 17 }

    回调方法里面有创建的对象,就可以通过Unity的API获取组件了

    1 function PromptCtrl.OnCreate(obj) 2 gameObject = obj; 3 transform = obj.transform; 4 5 panel = transform:GetComponent('UIPanel'); 6 prompt = transform:GetComponent('LuaBehaviour'); 7 8 prompt:AddClick(PromptPanel.btnOpen, this.OnClick); 9 resMgr:LoadPrefab('prompt', { 'PromptItem' }, this.InitPanel); 10 end

    View的初始化是在LuaBehaviour的Awake调用时完成的,例如PromptPanel.lua
    LuaBehaviour的Awake会调用PromptPanel的Awake函数,这样就能获取到View上的组件

    1 --启动事件-- 2 --LuaBehaviour.cs里面的Awake函数会调用这个函数 3 function PromptPanel.Awake(obj) 4 --这个就是Unity的GameObject对象 5 gameObject = obj; 6 transform = obj.transform; 7 8 this.InitPanel(); 9 logWarn("Awake lua--->>"..gameObject.name); 10 end 11 12 --初始化面板-- 13 function PromptPanel.InitPanel() 14 --使用Unity的API获取组件 15 this.btnOpen = transform:Find("Open").gameObject; 16 this.gridParent = transform:Find('ScrollView/Grid'); 17 end
  6. 这样,基本的框架流程就完成了,UI的交换操作就可以在Controller里面完成了

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )