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

时间: 2024-11-03 05:02:59

ulua-应用层模块编码的相关文章

python json模块

一.json格式介绍 JSON格式是一种轻量级别的数据交换格式,容易被人识别和机器用来解析,它的全称叫做 JavaScript Object Notation. json模块提供了和pickle持久化模块相似的API接口,可以将内存中的Python对象转换为一个串行化表示,被叫作json.json最广泛的应用于AJAX应用中的WEB服务器和客户端之间的通信,也可以用于其它程序的应用中. 二.json模块编码 玩蛇网Leo在这里使用json.dumps方法,将一个Python数据类型列表进行jso

python 各模块

01 关于本书 02 代码约定 03 关于例子 04 如何联系我们 1 核心模块 11 介绍 111 内建函数和异常 112 操作系统接口模块 113 类型支持模块 114 正则表达式 115 语言支持模块 12 _ _builtin_ _ 模块 121 使用元组或字典中的参数调用函数 1211 Example 1-1 使用 apply 函数 1212 Example 1-2 使用 apply 函数传递关键字参数 1213 Example 1-3 使用 apply 函数调用基类的构造函数 122

转:Python标准库(非常经典的各种模块介绍)

Python Standard Library 翻译: Python 江湖群 10/06/07 20:10:08 编译 0.1. 关于本书 0.2. 代码约定 0.3. 关于例子 0.4. 如何联系我们 核心模块 1.1. 介绍 1.2. _ _builtin_ _ 模块 1.3. exceptions 模块 1.4. os 模块 1.5. os.path 模块 1.6. stat 模块 1.7. string 模块 1.8. re 模块 1.9. math 模块 1.10. cmath 模块

跟我一起学extjs5(29--加入模块和菜单定义[2建立java bean])

跟我一起学extjs5(29--加入模块和菜单定义[2建立java bean]) 对上一节中加入的4个模块在java中建立相应的bean文件. 以上表建立好以后,需要建立java bean文件.在建立之前需要加入几个支持类. 先在com.jfok.server.common中建立包annotation,再在下面加入二个类库,这二个是自定义的注释类.分别用来注释每一个模块的信息和模块中每一字段的信息. package com.jfok.server.common.annotation; impor

10、其他模块

① 分组模块 分组(消息)是模拟器的基本对象.Ns-3中每个分组都包含一个字节缓冲区和一个Tag列表,通过Header类和Trailer类对缓冲区数据进行添加和删除.分组对象的接口提供一些私有数据的访问,Tags通过一个指针来实现,该指针指向TagData数据结构链表的开始,字节缓冲区和Tag链表的当前实现基于写时复制. Ns-3的分组对象包含一个字节缓冲区:协议头部和尾部有用户提供的串行化(serialization)和还原串行化(deserialization)例程在这个字节缓冲区串行化.N

应用层/安全层/传输层如何进行协议选型?

系统设计,协议先行. 大部分技术人没有接触协议的设计细节,更多的是使用已有协议进行应用层的编码,例如: (1)使用http作为载体,设计get/post/cookie参数 (2)使用dubbo框架,而不用去深究内部的二进制包头包体,以及序列号反序列化的细节 无论如何,了解协议设计的原则,对深入理解系统通信非常有帮助.今天就以即时通讯(后称im)为例,讲讲应用层的协议选型. 一.im协议的分层设计 所谓"协议"是双方共同遵守的规则,例如:离婚协议,停战协议.协议有语法.语义.时序三要素.

12 模块 - 《Python 核心编程》

?? 什么是模块? ?? 模块和文件 ?? 命名空间 ?? 导入模块 ?? 导入模块属性 ?? 模块内建函数包 ?? 模块的其他特性 12.1 什么是模块 模块是用来组织 Python 代码的方法, 而包则是用来组织模块的. 模块支持从逻辑上组织 Python 代码. 把其他模块中属性附加到你的模块中的操作叫做导入(import) . 那些自我包含并且有组织的代码片断就是模块( module ). 代码片段, 可能是一个包含数据成员和方法的类, 也可能是一组相关但彼此独立的操作函数. 12.2

WebRTC源码分析:音频模块结构分析

一.概要介绍WebRTC的音频处理流程,见下图: webRTC将音频会话抽象为一个通道Channel,譬如A与B进行音频通话,则A需要建立一个Channel与B进行音频数据传输.上图中有三个Channel,每个Channel包含编解码和RTP/RTCP发送功能. 以一个Channel而言,应用程序中将包含三个活动线程,录音线程,音频接收线程和播放线程. 1)录音线程:负责麦克风音频的采集,见图中红色路径,采集到音频后,缓存到一定长度,进行音频处理,主要包括EC,AGC和NS等.然后送到Chann

解析大型.NET ERP系统 权限模块设计与实现

权限模块是ERP系统的核心模块之一,完善的权限控制机制给系统增色不少.总结我接触过的权限模块,以享读者. 1 权限的简明定义 ERP权限管理用一句简单的话来说就是:谁 能否 做 那些 事. 文句 含义 说明 谁 部门+岗位职责 也可以不与部门岗位绑定,省略角色定义. 能否 能(True) 否(False) 用0或1,true/false表示能否执行 做 增加/删除/修改/查询/统计/打印/过帐 权限对象 哪些 通用的/本人的/本组别的/本部门的/本公司的/其他的/多帐套的 范围:行政部的办公文具