一、tolua#

c#调用lua:LuaState[变量名/函数名]



1.LuaState

a.执行lua代码段

DoString(string)

DoFile(.lua文件名)

Require(.lua文件名(但没有.lua后缀))



b.获取lua函数或者表

LuaFunction func = lua.GetFunction(函数名);             或者           LuaFunction func = lua[函数名] as LuaFunction;

LuaTable table = lua.GetTable(表名);



c.Start():如果需要使用wrap,则需要调用该方法

2.LuaFunction

Call()





3.LuaTable

LuaTable[变量名/函数名]

ToArray()

lua调用c#

在c#中将引用传递到lua中后:

1.通过“.” (点号)来使用非静态的变量以及静态的变量与方法

2.通过'':“ (冒号)来使用非静态的方法

3.通过"{}"来传递数组给c#

4.创建GameObject:newObject(变量)

5.摧毁GameObject:destroy(变量)

6.获取组件:GetComponent('LuaBehaviour')

二、LuaFramework(使用PureMVC)

a.基础模块

1.Util:对Mono的功能进行封装,这样不继承Mono的类就能使用Mono的东西了(如transform.Find、GetComponent);还有其他的工具方法

2.AppFacade:继承Facade,整套框架的入口

3.Base:继承MonoBehaviour,是一切View和Manager的基类;持有各种Manager的引用;能注册移除(view所感兴趣的)信息

4.View:只有一个方法:public virtual void OnMessage(IMessage message) 这是处理信息的方法

5.Manager:继承Base

6.AppView:继承View,是一个范例:注册View所感兴趣的信息,处理信息

b.lua模块

1.LuaFileUtils:通过.lua文件路径和AssetBundle文件路径这两种方式来找.lua文件,并读取返回byte[]

2.LuaLoader:继承LuaFileUtils,并无重要变化

3.LuaEvent:类似c#中的event,提供Add和Remove方法

4.LuaLooper:继承MonoBehaviour,在Update / LateUpdate / FixedUpdate中执行对应的LuaEvent

5.LuaBinder:如果执行的.lua文件需要用到unity中的类型,则需要用这个类给LuaState进行绑定

6.LuaManager:继承Manager,入口类,初始化Lua代码加载路径(调试模式下是在Assets \ LuaFramework目录下,非调试模式是在C:\luaframework\lua(window系统),默认是非调试模式),引用一个LuaState并封装其功能(读取lua文件、调用方法等)

7.LuaBehaviour:继承View,在Awake / Start中调用lua中对应的方法;并提供点击事件的相关处理

c.Manager模块

1.ResourceManager:加载AssetBundle的相关操作。在pc平台上默认加载的是Assets\StreamingAssets里的东西,移动平台上则是Application.persistentDataPath。那么如果我们想在pc平台上像移动平台一样读取外部路径(使用www),在pc平台模拟热更新,那么就可以在Initialize这个方法修改:m_BaseDownloadingURL = "file:///" + Util.DataPath;

unity5加载AB包的四个步骤:

a.为assetbundle起名字,并打包

b.加载总的清单文件

c.加载assetbundle的依赖文件

d.加载assetbundle

m_Dependencies:key为AB包的名字,value为依赖的AB包的名字

m_LoadedAssetBundles:key为AB包的名字,value为加载后的AB包

m_LoadRequests:key为AB包的名字,value为对包内资源的请求

先通过Initialize方法加载总的清单文件,然后我们可以通过LoadPrefab方法来加载AB包,此时会把对这个AB包的请求放在m_LoadRequests中,然后在OnLoadAsset方法对该AB包的所有请求进行处理,通过GetLoadedAssetBundle方法看看内存中有没有这个AB包,如果有的话,再检查一下该AB包的依赖包是否也在内存中,如果都在,就把请求的包内资源加载出来,并回调方法。如果出现缺包情况,会通过OnLoadAssetBundle方法加载AB包及其依赖包(使用递归)。

至于卸载AB包,使用的是UnloadAssetBundle方法。这里还有说一下引用计数的问题,例如有A1A2A3三个包,A2A3依赖A1,然后我们加载A2A3。那么A1的引用计数为2,A2的引用计数为1,A3的引用计数为1,当使用UnloadAssetBundle卸载掉A2包时,A1的引用计数变为1,此时还会留在内存中,再卸载A3包,A1的引用计数变为0,A1包就自动被卸载了。包被加载一次,则引用计数加1,所以上面的A2A3包引用计数为1,;包被依赖一次,则引用计数加1,所以上面的A1包引用计数为2,;每次卸载时计数减1,减到0则从内存中去掉。

2.PanelManager:默认lua创建的panel都要在tag为GuiCamera的物体下,提供创建panel的方法

3.ThreadManager:解包与下载资源

lua代码分析:

PromptPanel.lua

1.函数是可以存储在变量中的。函数与其他所有值都是匿名的,即它们都没有名称。当讨论一个函数名时,实际上是在讨论一个持有某函数的变量。

[csharp] view
plain
 copy

  1. a = {p = print}
  2. a.p("hello woeld")     --hello woeld
  3. print = math.sin
  4. a.p(print(3.14159))    --约等于0
  5. sin = a.p
  6. sin(10,20)             --10 20

所以对于:function foo(x) return 2*x end                                             其实就是等于:foo = function (x) return 2*x end

那么对于:function PromptPanel.Awake(obj)  xxx end                     其实就是等于:PromptPanel.Awake = function (obj)  xxx end

2.引用table

[csharp] view
plain
 copy

  1. a = {}                --创建一个table,并将它的引用存储到a
  2. a["x"] = 10
  3. b = a                 --b与a引用了同一个table
  4. print(b["x"])         --10
  5. b["x"] = 20
  6. print(a["x"])         --20
  7. a = nil               --现在只有b还在引用table
  8. b = nil               --再也没有对table的引用了

3.

[csharp] view
plain
 copy

  1. a = {}
  2. x = "y"
  3. a[x] = 10
  4. print(a[x])    --10
  5. print(a.x)     --nil
  6. print(a.y)     --10
  7. --a.x等同于a["x"]

那么,对于上面的PromptPanel.Awake,就是等于PromptPanel["Awake"]

PromptCtrl.lua

1.对于没有local声明的变量均为全局变量,可以在其他.lua文件中调用

2.在Common/define.lua中注册View、Controller,define.lua中持有各种manager的引用

PromptPanel & PromptCtrl:PromptPanel维护了面板的控件变量,提供给PromptCtrl使用,没有model层是因为没有数据

CtrlManager:管理controller层,维护所有的controller

Game:在OnInitOK方法中指定开始的panel,例如例子中的:local ctrl = CtrlManager.GetCtrl(CtrlNames.Prompt);

总结

1.对于一个panel,需要添加或修改的文件:

a.添加xxxPanel & xxxCtrl

b.修改define、Game、CtrlManager

详细的可见:http://blog.csdn.net/adambieber/article/details/47402805

2.在lua中使用AB包内的资源的两种方法:

a.panelMgr:CreatePanel('Prompt', this.OnCreate);

b.resMgr:LoadPrefab('prompt', { 'PromptItem' }, this.InitPanel);

其中a是对b的进一步封装,因此两者都需要提供AB包名、要访问的包内资源名字(如果是panel,则默认资源名为AB包名+"Panel")以及回调方法(参数是AB包中的资源)

3.热更新的四个步骤:打包、解包、更新和加载。而这四个步骤框架已经给我们封装好了,基本上就不需要我们去管了,但还是很有必要理解其中的过程。

a.打包:将资源全部打包到StreamingAssets文件夹

打包类:LuaFramework / Editor / Packager

打包lua文件:HandleLuaBundle,对Assets\LuaFramework\Lua 与 Assets\LuaFramework\ToLua\Lua这两个目录下的所有lua文件进行打包

打包图片等资源:HandleExampleBundle

b.解包:在移动端StreamingAssets这个文件夹是只读的,但是要做热跟新的话,就需要写入文件,因此Application.persistentDataPath这个可读可写的路径才是数据在移动端的存放路径,同时也为了比较MD5的值,就需要将StreamingAssets的东西解包(复制)到Application.persistentDataPath

c.更新:files.txt这个文件记录了所有的资源文件及其MD5值,每次进入游戏时都会从服务器下载最新的files.txt,然后对其遍历比较MD5值,如果值不同或者不存在则下载

d.加载:先加载资源的依赖,再加载资源

那么,如果我们对外发布了一个版本1.1,然后更改资源,发布1.2,要做的就是:重新生成apk并上传,然后将StreamingAssets文件夹下的东西上传到服务器,具体位置见AppConst.WebUrl;对于用户来说,如果他安装的是1.1,那么就会下载更新,如果他安装的是1.2,那么解包之后就得到最新的资源了,无需更新了。

4.整套框架的工作流程:

c#

打包好后,启动游戏,GameManager会进行一些判断,如果这是游戏安装之后的第一次启动,那么就会进行解包操作。如果AppConst.UpdateMode为false,那么就不会检测更新,否则就会进行更新操作。然后进入初始化操作,调用Game.lua中的OnInitOK方法,进入lua逻辑。

lua

然后调用指定控制器的Awake方法、PanelManager的CreatePanel方法,调用c#代码,创建panel,为其添加LuaBehaviour,调用xxxPanel.lua的方法,获取控件引用,进行逻辑处理。

From:http://blog.csdn.net/lyh916/article/details/45021703


[Unity热更新]tolua# & LuaFramework(一):基础的更多相关文章

  1. Unity3D热更新之LuaFramework篇[07]--怎么让unity对象绑定Lua脚本

    前言 在上一篇文章 Unity3D热更新之LuaFramework篇[06]--Lua中是怎么实现脚本生命周期的 中,我分析了由LuaBehaviour来实现lua脚本生命周期的方法. 但在实际使用中 ...

  2. Unity3D热更新之LuaFramework篇[02]--用Lua创建自己的面板

    在上篇文章 Unity3D热更新之LuaFramework篇[01]--从零开始 中,我们了解了怎么获得一个可用的LuaFramework框架. 本篇将我会先介绍一下如何配置Lua开发环境,然后分析在 ...

  3. Unity3D热更新之LuaFramework篇[10]--总结篇

    背景 19年年初的时候,进到一家新单位,公司正准备将现有的游戏做成支持热更的版本.于是寻找热更方案的任务就落在了我头上. 经过搜索了解,能做Unity热更的方案是有好几种,但是要么不够成熟,要么不支持 ...

  4. Unity3D热更新之LuaFramework篇[05]--Lua脚本调用c#以及如何在Lua中使用Dotween

    在上一篇文章 Unity3D热更新之LuaFramework篇[04]--自定义UI监听方法 中,我对LuaBehaviour脚本进行了扩展,添加了两个新的UI监听方法,也提到最好能单写一个脚本处理此 ...

  5. Unity3D热更新之LuaFramework篇[03]--prefab加载和Button事件

    在上一篇文章 Unity3D热更新之LuaFramework篇[02]--用Lua创建自己的面板 中,我介绍了LuaFramework加载面板的方法,但这个方法并不适用于其它Prefab资源,在这套框 ...

  6. Unity3D热更新之LuaFramework篇[09]--资源热更新与代码热更新的具体实现

    前言 在上一篇文章 Unity3D热更新之LuaFramework篇[08]--热更新原理及热更服务器搭建 中,我介绍了热更新的基本原理,并且着手搭建一台服务器. 本篇就做一个实战练习,真正的来实现热 ...

  7. 另类Unity热更新大法:代码注入式补丁热更新

    对老项目进行热更新 项目用纯C#开发的? 眼看Unity引擎热火朝天,无数程序猿加入到了Unity开发的大本营. 一些老项目,在当时ulua/slua还不如今天那样的成熟,因此他们选择了全c#开发:也 ...

  8. unity热更新方案对比

    Unity应用的iOS热更新 •  什么是热更新 •  为何要热更新 •  怎样在iOS 上对Unity 应用进行热更新 •  支持Unity iOS 热更新的各种Lua 插件的对照 什么是热更新 • ...

  9. Unity3D热更新之LuaFramework篇[04]--自定义UI监听方法

    时隔一个多月我又回来啦! 坚持真的是很难的一件事,其它事情稍忙,就很容易说服自己把写博客的计划给推迟了. 好在终于克服了自己的惰性,今天又开始了. 本篇继续我的Luaframework学习之路. 一. ...

随机推荐

  1. springMVC中Restful支持

    RESTFul支持 http://localhost:8090/user/doAdd.action?username=tony&age=8 http://localhost:8090/user ...

  2. pl/sql中的record用法

    create or replace procedure pro1(v_in_empno in number) is --定义一个记录数据类型 type my_emp_record is record( ...

  3. [转]Nginx调用远程php-fpm

    Nginx调用远程php-fpm 前后端分离的网站,要在异地部署多套网页的时候,这种nginx配置调用远程php-fpm的方式,不错.可以提高网页的相应速度. 原文: https://www.cnbl ...

  4. 用C++实现文件压缩(1 哈弗曼编码)

    今天下午想把文件压缩写一下,因为我觉得这个还是比较锻炼技术的,对数据结构的要求应该比较高,权当练习了吧. 我采用的压缩方式是Huffman编码,不过比较囧的是,我拼写拼错了,我拼的是haffman,在 ...

  5. 阿里云ECS linux通过iptables 配置SNAT代理网关,实现局域网上网

    场景说明: 本文将介绍如何通过为VPC中Linux系统的ECS实例配置SNAT,实现无公网ECS通过有EIP的服务器代理访问公网. 步骤: 1.使用SSH的方法登陆一个已经绑定EIP外网的ECS实例. ...

  6. 页面找不到js方法的原因,关于EasyUI

    有时EasyUI中datagride写法不正确,会导致无法加载页面上其他的js方法.datagride中的逗号是一个也不能多.一定要注意: 例如以下代码中标红的逗号就会导致后边的js不能正常加载. c ...

  7. CentOS6.5下docker的安装及遇到的问题和简单使用(已实践)

    转载自 CentOS6下docker的安装和使用 Docker是一个开源的应用容器引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.利用Linux的LXC.AUFS. Go语言.c ...

  8. Linux下Jenkins+git+gradle持续集成环境搭建

    Linux下Jenkins+git+gradle持续集成环境搭建 来源:IT165收集  发布日期:2014-08-22 21:45:50 我来说两句(0)收藏本文   一.项目介绍 和 linux ...

  9. 虚拟机下安装CentOS无法上网的解决方式

    我使用VMware虚拟机安装Ubuntu和CentOS,都使用NAT模式连接网络,可是Ubutun能够正常上网,而CentOS不能连接到网络. 原来Centos7默认是不启用有线网卡的.须要手动开启. ...

  10. Mylyn--谁用谁知道!

    Mylyn――谁用谁知道!http://www.blogjava.net/alwayscy/archive/2008/06/15/208022.html 此文是我之Mylyn初体验,不搞大而全,而只把 ...