001,LuaFramework基本流程

Wesley13
• 阅读 458

启动顺序

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

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

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

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

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

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

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

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

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

    PanelNames里面的内容

     PanelNames = {
         "PromptPanel",    
         "MessagePanel",
     }
    

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

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

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

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

     protected void Awake() {
         //最终lua方法的调用是通过Module.Function的形式实现的
         //例如PromptPanel.Awake
         Util.CallMethod(name, "Awake", gameObject);
     }
    
     protected void Start() {
         Util.CallMethod(name, "Start");
     }
    
     protected void OnClick() {
         Util.CallMethod(name, "OnClick");
     }
    
     protected void OnClickEvent(GameObject go) {
         Util.CallMethod(name, "OnClick", go);
     }
    

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

     function PromptCtrl.OnCreate(obj)
         gameObject = obj;
         transform = obj.transform;
    
         panel = transform:GetComponent('UIPanel');
         prompt = transform:GetComponent('LuaBehaviour');
    
         prompt:AddClick(PromptPanel.btnOpen, this.OnClick);
         resMgr:LoadPrefab('prompt', { 'PromptItem' }, this.InitPanel);
     end
    

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

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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
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
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这