您的位置:首页 > 编程语言 > Lua

ulua-应用层模块编码

2020-02-04 09:12 447 查看
Author:    Alot 2015/04/07 14:55   Description:    为客户端技术迁移为Lua编码方式做基础技术讲解,旨在介绍目前使用的简单框架,和应用模块C#转为Lua编码的技术扫盲。(具体有关底层数据解析方面的内容这里不会涉及)   1、Simple Framework(http://ulua.org/simpleframework.html)    ########################### ulua简单框架,考虑到技术实现比较成熟选用,技术支持比较方便。 截止网站最新版本:0.2.7f1 目前集成版本:0.2.6f2   缺点:目前真正使用到H1的时候Bug比较多,需要修改为符合项目的方式,另外底层数据方面需要我们自己支持 项目:目前底层与服务端通信数据的解析工作基本接近尾声,改为支持热更新方式可以逐步全面启动。     2、文件目录结构    ###############################################################   这里大部分通过名称可以知道在项目中的使用范围和方式       3、继承结构    ###################################################################     father:    uluaBase.lua(包含:__baseId \ __baseName)             child:    UIModuleViewBasic.lua(包含父id\name 自身viewId \ viewName)             child:    ModuleControllerBasic.lua(包含父id\name 自身controllerId \ controllerName)
            child:    UIModuleDataMapBasic(包含父id\name 自身dataMapId \ dataMapName)     4、H1模块结构    #################################################################     0)UIModuleManager     1)Model     2)View     3)Controller     4)ProxyModule 这个是我们之前就的实现方式       0)UIModuleManager     1)Model     2)View     3)Controller     4)MainUIDataMapping(映射模块数据)         local DataMapping = {             {id = 1, name = "TradeModule", path = "GameScripts.UIModule.Trade.TradeModelDataMap"},             {id = 2, ......         }     5)ModelDataMap(具体模块映射数据关系)         self.UIDataMap.ControllerDataMap = {             {id = 1, name = "TradeBaseView", controller = "TradeBaseController",                 requirePath = {                     {reqtype = self.ModelRt(), path = "Trade.TradeModel"},                     {reqtype = self.ControlRt(), path = "Trade.TradeBaseController"},                     viewPath = "TradeBaseView" }},               {id = 2, name = "TradeCenterView", controller = "TradeCenterController",                 requirePath = {                     {reqtype = self.ControlRt(), path = "Trade.TradeCenter.TradeCenterController"},                     viewPath = "TradeCenterView" }},             {id = 3, ......   通过与C#的实现方式对比我们可以清楚的看到这里多了两个用于映射数据的.lua文件 1)MainUIDataMapping:通过模块名称require具体的模块映射数据 2)ModelDataMap:MainUIDataMapping载入的具体模块数据,这里又细分为该模块各个面板的映射关系,这里如果觉得不是最优解,请大家思考改进方式。   3)UIModuleManager.lua:复制C#中的UIModuleManager.cs功能,有异同之处,主要区别在:       a、local _moduleGameObjectTable = {} (保存打开模块GameObject,在关闭模块的时候直接遍历销毁并置空)          local _moduleControllerTable = {}(保存打开模块具体Controller,在关闭模块的时候直接遍历调用Controller:Dispose()方法,并置空)       b、function UIModuleManager:OpenFunModule(moduleName, moduleDataMapName, addBgMask, bgMaskClose, depth)(与C#中传入的参数多一个"moduleDataMapName",用于require MainUIDataMapping(moduleName))     这里需要特别说明一下:调用打开模块的这个方法,实际上最后还是 ->          (Lua)functions.createPanel(_moduleName) ->          (Lua)GameDirector.panelManager:CreatePanel(name) ->         (C#)PanelManager.CreatePanel(string name) ->          加载并解压AB,返回prefab GameObject ->          实例化,设置基本参数(position,rotation,size...)->          实例结束,通知lua端 (C#)GameManager.CreateModuleCallback(GameObject moduleObj) ->          (Lua接收)GameManager.CreateModuleCallback() -> End(继续执行需要的操作) 在实际使用中可以自己去看。       c、b操作结束后需要为返回回来的GameObject绑定View.lua \ Controller.lua         (遍历ModelDataMap.UIDataMap.ControllerDataMap.requirePath, require 指定路径的文件)       d、模块的关闭操作:遍历a中的两个table,清除值就可以了。     5、EvenDelegate Bind     在callback中包裹一层 LuaFunction     6、lua update 和 coroutine(协程)(参考https://www.geek-share.com/detail/2598557600.html)     1)Update:简单框架为我们提供了一个模型,在LuaScriptMgr.cs中包含一个Update()方法,在GameStart.cs的Update中每帧调用该方法,       2)Invoke:可以使用Lua里面提供的coroutine替代。     7、ModuleView.lua的生成     使用原来生成moduleView.cs的工具生成文件,文件的路径目前固定为该路径下:\Assets\_luaScript\Lua\GameScripts\UIModule\UIView\          8、AB打包     1)首先打共享资源包:主要是MyFont1.prefab \ CommonUIAltas_V2.prefab     2)模块资源包:模块具体各个面板打包成单独的资源包,类似如下

转载于:https://www.cnblogs.com/GAnnie/p/4403368.html

  • 点赞
  • 收藏
  • 分享
  • 文章举报
davge198431 发布了0 篇原创文章 · 获赞 0 · 访问量 9 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: