启动顺序
-
Main.cs绑定到场景的一个组件上
1 public class Main : MonoBehaviour { 2 void Start() { 3 AppFacade.Instance.StartUp(); //启动游戏 4 } 5 } -
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 } -
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 } -
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 endInitViewPanels函数会载入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 endPanelNames里面的内容
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 -
对于每一个视图都有一个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 endView的初始化是在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 -
这样,基本的框架流程就完成了,UI的交换操作就可以在Controller里面完成了