zoukankan      html  css  js  c++  java
  • ulua-应用层模块编码

    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 ame 自身viewId viewName)
                child:    ModuleControllerBasic.lua(包含父id ame 自身controllerId controllerName)
                child:    UIModuleDataMapBasic(包含父id ame 自身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\_luaScriptLuaGameScriptsUIModuleUIView
        
     
     
    8、AB打包
        1)首先打共享资源包:主要是MyFont1.prefab CommonUIAltas_V2.prefab
        2)模块资源包:模块具体各个面板打包成单独的资源包,类似如下
  • 相关阅读:
    [清华集训2016]温暖会指引我们前行——LCT+最大生成树
    BZOJ1415[Noi2005]聪聪和可可——记忆化搜索+期望dp
    NOIP2018游记
    BZOJ4832[Lydsy1704月赛]抵制克苏恩——期望DP
    BZOJ1906树上的蚂蚁&BZOJ3700发展城市——RMQ求LCA+树链的交
    BZOJ2822[AHOI2012]树屋阶梯——卡特兰数+高精度
    BZOJ4001[TJOI2015]概率论——卡特兰数
    BZOJ1805[Ioi2007]Sail船帆——线段树+贪心
    [IOI2018]排座位——线段树
    BZOJ3718[PA2014]Parking——树状数组
  • 原文地址:https://www.cnblogs.com/GAnnie/p/4403368.html
Copyright © 2011-2022 走看看