- 将 xLua 加入现有项目中
(1)从 xLua Git 地址 下载源码后解压;
(2)将 Assets 文件夹中的全部文件,拷贝到现有项目的 Assets 文件夹中;
(3)将 Tools 文件夹,拷贝到现有项目的 Assets 同级目录;
(4)打开 08_Hotfix 示例场景,如下图所示:
参考文档:
项目地址:https://github.com/Tencent/xLua
教程:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/XLua%E6%95%99%E7%A8%8B.md
常见问题(FAQ):https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/faq.md - C# 加载 Lua 脚本
(1)直接执行字符串
(2)通过 Lua 的 require 加载文件
注1:默认情况下只能加载 Resources 路径下,以 .lua.txt 为后缀名的 lua 脚本文件;
注2:可通过自定义 Loader 从其他目录,加载其他后缀名的 lua 脚本文件。
注3:官方文档 教程
- C# 访问 Lua
(1)全局基本类型
luaenv.Global.Get<int>("a") //全局基本类型 Global.Get<类型>(“变量名”) luaenv.Global.Get<string>("b") luaenv.Global.Get<bool>("c")
[CSharpCallLua] public interface ItfD { int f1 { get; set; } int f2 { get; set; } int add(int a, int b); } ItfD d3 = luaenv.Global.Get<ItfD>("d"); //全局 table Global.Get<接口名>("变量名") d3.f2 = 1000; Debug.Log("_G.d = {f1=" + d3.f1 + ", f2=" + d3.f2 + "}"); Debug.Log("_G.d:add(1, 2)=" + d3.add(1, 2));
[CSharpCallLua] public delegate int FDelegate(int a, string b, out DClass c); public class DClass { public int f1; public int f2; } FDelegate f = luaenv.Global.Get<FDelegate>("f"); DClass d_ret; int f_ret = f(100, "John", out d_ret); //lua的多返回值映射:从左往右映射到c#的输出参数,输出参数包括返回值,out参数,ref参数 Debug.Log("ret.d = {f1=" + d_ret.f1 + ", f2=" + d_ret.f2 + "}, ret=" + f_ret);
- Lua 访问 C#
local UnityEngine = CS.UnityEngine local newGameObject = UnityEngine.GameObject() --构造函数 UnityEngine.Time.timeScale = 0.5 --静态属性 UnityEngine.Find('helloworld') --静态方法 testobj.DMF = 1024 --成员属性 testobj:DMFunc() --成员方法(第一个参数需要传该对象,建议用冒号语法糖)
- 如何通过 Lua Fix C# 代码逻辑
(1)给需要 Lua 修正逻辑的类打上 Hotfix 标签;
(2)通过 xlua 的 xlua.hotfix(class, [method_name], fix)
--把 C# 的 HotfixTest 类(继承于 MonoBehaviour)的 Update 函数替换成 lua 的实现 xlua.hotfix(CS.HotfixTest, 'Update', function() print('Update in lua') end)
- 原理概览