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)模块资源包:模块具体各个面板打包成单独的资源包,类似如下
  • 相关阅读:
    HDU 5791 Two (DP)
    POJ 1088 滑雪 (DPor记忆化搜索)
    LightOJ 1011
    POJ 1787 Charlie's Change (多重背包 带结果组成)
    HDU 5550 Game Rooms (ccpc2015 K)(dp)
    HDU 5542 The Battle of Chibi (ccpc 南阳 C)(DP 树状数组 离散化)
    HDU 5543 Pick The Sticks (01背包)
    HDU 5546 Ancient Go (ccpc2015南阳G)
    NB-IoT的DRX、eDRX、PSM三个模式 (转载,描述的简单易懂)
    MQTT 嵌入式端通讯协议解析(转)
  • 原文地址:https://www.cnblogs.com/GAnnie/p/4403368.html
Copyright © 2011-2022 走看看