码迷,mamicode.com
首页 > 其他好文 > 详细

ulua-应用层模块编码

时间:2015-04-08 19:44:10      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

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)模块资源包:模块具体各个面板打包成单独的资源包,类似如下
技术分享

ulua-应用层模块编码

标签:

原文地址:http://www.cnblogs.com/GAnnie/p/4403368.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!