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)模块资源包:模块具体各个面板打包成单独的资源包,类似如下
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
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- python字符串编码识别模块chardet简单应用
- python字符串编码识别模块chardet简单应用
- Python基础知识——urllib模块在爬虫中的应用
- Aop织入OOP模块中 ,我们需要知道系统在执行点,Jionpoint after Advice AOP 的应用场景与织入器
- SNMP协议(一)——编码模块设计与实现
- MarkDown Letex 编码 之 随机过程及应用(二) - E[X|Y] = E[Y E[X|Y]]证明
- 解决Linux下Python编码问题,以及导入模块的问题
- H.264视频编码标准在网络视频监控系统中的应用 .
- 自定义ClassLoader实现java应用核心逻辑模块热部署
- puppet 手册之puppet rsync 模块应用完整版
- 文字编码处理模块
- Java应用中的编码问题
- iOS百度地图简单应用( iOS地图定位(定位、地理编码与反地理编码、mapView、大头针)
- Python应用指定路径下的模块(非默认路径)
- Java多线程与并发应用-(11)-用Lock+Condition实现1,2,3 三个模块按顺序执行。
- [转]Android 应用的自动升级、更新模块的实现
- Ansible命令应用之常用模块(持续更新中)
- Android 应用的自动升级、更新模块的实现
- 微软企业库4.1学习笔记(二十二)加解密模块2 在应用中使用加密解密
- random模块的应用及常犯的错误-猜大小数字游戏