下载XLua:   https://github.com/tencent/xlua

项目中使用XLua只需将Plugins和XLua两个文件夹拷贝到U3D中即可
XLua只是核心,用于实现Lua和C#交互,但是并没有提供便捷的"框架",我们在项目中使用XLua的话,需要自己实现框架部分,这样才能实现"从服务器端下载AB和Lua资源,完成客户端的热更新"

C#调用Lua
  using XLua;
  //一个LuaEnv实例就是一个Lua虚拟机,建议全局唯一
  LuaEnv luaEnv = new LuaEnv();
  luaEnv.DoString("print('test')");
     C#调用外部Lua代码文件

  luaEnv.DoString("require 'extraTestLua'");//默认路径是XLua/Resources,不需要写后缀
  在XLua\Resources文件夹下创建lua文件,文件的后缀是txt;XLua中完整的Lua文件名格式:fileName.lua.txt

  

  
  C#获取Lua代码中的数据
  luaEnv.Global.Get<int>("a"); //获取lua中的数值
  luaEnv.Global.Get<string>("b"); //获取Lua中的字符串
  luaEnv.Global.Get<bool>("c"); //获取lua中的布尔
  luaEnv.Global.Get<LuaFunction>("d"); //获取lua中的方法

Lua调用C#
  CS.UnityEngine.GameObject
  CS.UnityEngine.Debug.Log()
  CS.UnityEngine.GameObject.Find()
  //Lua调用C#,需要在C#的命名空间之前要加前缀: CS.

//lua中不写new和泛型

Lua语言中实例对象调用自身的方法要用":"号

Lua语言中小树不需要加"f"后缀

     LuaEnv luaEnv = new LuaEnv();   //lua运行虚拟机
//luaEnv.DoString("print('hellow')"); luaEnv.DoString("require 'extraTestLua'");//C#调用外部Lua代码文件,不需要写路径和后缀
int a = luaEnv.Global.Get<int>("a"); //获取lua中的数值
string b = luaEnv.Global.Get<string>("b"); //获取Lua中的字符串
bool c = luaEnv.Global.Get<bool>("c"); //获取lua中的布尔
LuaFunction d = luaEnv.Global.Get<LuaFunction>("d"); //获取lua中的方法
d.Call(); string luaScript = @"
local GameObject = CS.UnityEngine.GameObject
local Debug = CS.UnityEngine.Debug local player = GameObject('xxxxx')
Debug.Log(player.name) local camera = GameObject.Find('Main Camera')
Debug.Log(camera.name)
";
luaEnv.DoString(luaScript);

XLua热补丁
使用XLua来热更新的项目,原始项目在开发过程中全部用C#编写,不需要写Lua代码,能大大提高项目的开发效率,只有当项目中的功能需要热更新的时候才需要编写  Lua代码
原始项目中出现了问题,写Lua代码进行修补,这种方式叫做"热补丁[HotFix]"
*热补丁环境初始化步骤
  1.添加宏信息
  File-->Build Settings -->Player Settings -->ConfigurationScriptingDefineSymbols: HOTFIX_ENABLE

  2.执行菜单生成命令

  XLua->Generate Code该命令执行完毕后会生成一堆Wrap文件,存放到XLua/Gen文件夹下
  3.执行菜单注入命令
  XLua->Hotfix Inject In Editor
   成功之后会在控制台输出:"hotfix inject finish!"或"hotfix injected"
   如果不成功,需要把Tools文件夹拷贝到项目中,和Assets文件夹同级别位置
热补丁
  1.HotFix特性标签
  在使用C#语言开发项目时,需要后续进行"热补丁修复"的类,需要在类的头部添加一个特性标签:[Hotfix],表示该类可以被XLua热修复
  2.Hotfix语法
  xlua.hotfix(CS.类名, '方法名', lua方法)
  这个是lua代码结构,需要使用Lua虚拟机对象中的DoString方法执行:某个类中的某个方法,使用lua方法进行修复
  注意:每次添加hotfix,需要重新注入命令
  有参方法修复时,需要传递当前脚本对象this,在lua中用self代替

using UnityEngine;
using XLua; [Hotfix]
public class MyHotfix : MonoBehaviour
{
private string test = "test";
void Start()
{
Hello();
Add(, );
} private void Hello()
{
Debug.Log("C#: Hello" + test);
} private void Add(int a, int b)
{
Debug.LogFormat("C#: a + b = {0}", a + b);
}
}
using UnityEngine;
using XLua; public class HotFixManager : MonoBehaviour
{
private LuaEnv luaEnv; void Start()
{
luaEnv = new LuaEnv();
luaEnv.DoString("require 'luaFix'");
}
}
--luaFix.lua.txt
local Debug = CS.UnityEngine.Debug xlua.private_accessible(CS.MyHotfix) xlua.hotfix(CS.MyHotfix, 'Hello', function(self)
Debug.Log('lua: Hello' + self.test)
end) xlua.hotfix(CS.MyHotfix, 'Add', function(self, a, b)
Debug.LogFormat("lua: a + b = {0}", a + b);
end) print('XLua HotFix Over')

Lua访问C#脚本内的字段
  1:可以在lua代码内通过"self.字段名"进行访问,但是这样有一个前提,该字段必须是public修饰的,private修饰的访问不到,但是这样有一个弊端,破坏了C#语言本身的封装性
  2:在lua语言中,使用代码获取C#类中private成员的访问权,可以在Lua脚本中访问到C#类当中的私有成员,同时不会破坏C#原有的封装性和逻辑关系.
  xlua.private_accessible(CS.类名)
  self.字段名 ....

xlua.private_accessible(CS.MyHotfix)    --获取MyHotfix类中字段的private权限

local GameObject = CS.UnityEngine.GameObject

xlua.hotfix(CS.MyHotfix, 'CreateObject', function(self)
GameObject.Instantiate(self.prefab, Vector3(, , ), Quaternion.identity);
end)

XLua默认是读取Resources文件夹下的Lua文件,但是Resources文件夹的特点是"文件压缩",并不适合Lua文件的热更新

所以我们最好把Lua文件放到StreamingAssets文件夹下

luaEnv.DoString("require 'luaFix'");//默认读取XLua\Resources文件夹

总结XLua Hotfix

下载XLua

将Assets里面的Plugins和XLua拷贝到项目,Tools拷贝到与Assets同级文件夹

PlayerSetting里面将Scripting Define Symbols设置HOTFIX_ENABLE

将需要热修复的类添加[Hotfix]特性,表示它可以热修复

创建一个lua脚本,后缀为.lua.txt, 再添加热修复代码(这个就是热更新的文件,丢到服务器上下载就可以实现热修复)

获取类:            CS.命名空间.类名

获取类中字段的private权限:   xlua.private_accessible(类名)

 修复方法:           xlua.hotfix(CS.类名, '方法名', lua方法)

再调用lua修复类

LuaEnv luaEnv = new LuaEnv();
luaEnv.DoString("require 'path'");//不写.lua.txt后缀

lua学习笔记4--XLua的更多相关文章

  1. [转]LUA 学习笔记

    Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...

  2. Lua 学习笔记(一)

    Lua学习笔记 1.lua的优势 a.可扩张性     b.简单     c.高效率     d.和平台无关 2.注释 a.单行注释 --        b.多行注释 --[[  --]] 3.类型和 ...

  3. Lua学习笔记6:C++和Lua的相互调用

        曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有.     新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项 ...

  4. Lua学习笔记4. coroutine协同程序和文件I/O、错误处理

    Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...

  5. (转)Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境

    Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境(一)注意:工程必须添加两个宏:“配置属性”/“C或C++”/“预处理器”/“预处理器定义”,添加两个宏:_CRT_SECURE_ ...

  6. Lua学习笔记:面向对象

    Lua学习笔记:面向对象 https://blog.csdn.net/liutianshx2012/article/details/41921077 Lua 中只存在表(Table)这么唯一一种数据结 ...

  7. Lua学习笔记(二):基本语法

    Lua学习指南:http://www.lua.org/manual/ 首先我们要明确的一点是:在Lua中,除了关键字外一切都是变量. Lua关键字 可以查看这个地址:http://www.lua.or ...

  8. Unity的学习笔记(XLua的初学用法并在lua中使用unity周期函数)

    自己最近也在研究怎么用lua控制UI,然后看着网上介绍,决定选用XLua,毕竟TX爸爸出的,有人维护,自己琢磨着怎么用,于是弄出来一个能用的作为记录. 当然,XLua主要是用于热更新,我自己是拿来尝试 ...

  9. Lua学习笔记一

    学习了有一周多了.之前一直不想献丑,但还是记录下这个过程. 第1章  开发软件搭建 1. ubuntu 下lua安装 sudo apt-get install lua5.1 2.win下的环境搭建. ...

随机推荐

  1. 这个是自定义的代码块在xcode中的路径

    ~/Library/Developer/Xcode/UserData/CodeSnippets

  2. cookie和Session是啥?

    HTTP是无状态(stateless)协议 http协议是无状态协议即不保存状态. 无状态协议的优点: 由于不需要保存记录,所以减少服务器的CPU和内存的资源的消耗.毕竟客户端一多起来保存记录的话对于 ...

  3. 【python爬虫】 爬云音乐我和xxx共同听过的歌曲

    闲聊的时候,觉得,想写个爬虫,爬下2个人共同听过的歌曲有哪些,然后一鼓作气,花了一个多小时,写了一个.支持最近一周和所有时间,需要用户没有关闭听歌排行显示 How to start 使用到的工具是Se ...

  4. add(expr|ele|html|obj[,con]) 把与表达式匹配的元素添加到jQuery对象中。

    add(expr|ele|html|obj[,con]) 概述 把与表达式匹配的元素添加到jQuery对象中.这个函数可以用于连接分别与两个表达式匹配的元素结果集. jQuery 1.4 中, .ad ...

  5. PHP mysqli_fetch_lengths() 函数

    mysqli_fetch_lengths() 函数返回结果集中的字段长度. <?php // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con=mysqli_con ...

  6. [Luogu] 魔法树

    https://www.luogu.org/problemnew/show/P3833 树链剖分 + 线段树 为啥会RE?? 不解 #include <iostream> #include ...

  7. luogu P2585 [ZJOI2006]三色二叉树

    P2585 [ZJOI2006]三色二叉树 题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过10000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO ...

  8. 虚拟机扩展Linux根目录磁盘空间

    简要扩展空间方法http://www.kwx.gd/CentOSApp/Xen-Centos6-Mounted-HardDrive.html 最近在VMware虚拟机上使用Centos,用着用着,发现 ...

  9. python能用来做什么?这3大主要用途你一定要知道!(实用)

    导读:如果你想学Python,或者你刚开始学习Python,那么你可能会问:“我能用Python做什么?” 这个问题不好回答,因为Python有很多用途. 但是随着时间,我发现有Python主要有以下 ...

  10. 黑马lavarel教程---9、缓存操作

    黑马lavarel教程---9.缓存操作 一.总结 一句话总结: legend2项目中自己写的哪些文件操作都可以通过这里的缓存实现,简单方便 1.lavarel中如何使用后端主流的缓存如 Memcac ...