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(协程)(参考http://my.oschina.net/wangxuanyihaha/blog/186401)
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)模块资源包:模块具体各个面板打包成单独的资源包,类似如下