xLua下载
https://github.com/Tencent/xLua
解压后打开Assets目录将文件拖进新工程即可使用
主要函数和用法
C#端:
命名空间引入
using XLua;
主要类
LuaEnv luaEnv = new LuaEnv();//最好全局只有一个
luaEnv.Dispose();//Lua关闭,一般在程序关闭时调用
通过字符串运行Lua
luaEnv.DoString("print('hello world!!!')");
加载文件
//添加自定义加载方式
luaEnv.AddLoader(
(ref string FileName) =>
{
string filePath = Application.streamingAssetsPath + "/" + FileName + ".Lua";
return File.ReadAllBytes(filePath);
}
);
luaEnv.DoString("require 'Lua001'");//lua插件,通过lua语法自己加载文件
变量获取
//获取lua里的全局变量
int a = luaEnv.Global.Get<int>("a");
string str = luaEnv.Global.Get<string>("str");
bool bit = luaEnv.Global.Get<bool>("isBit");
类型映射
可以像变量一样直接映射到Class,但会更耗性能
推荐是使用接口映射
Lua里的表:
Person = {
name = 'SDHK',
age = 100,
eat1 = function(self, a, b) --lua的函数如果要传参,都要有个self将自己传进去,self==this 一个意思
print((a + b) .. ' SDHK!!!!')
end
}
function Person:eat(a, b) --这种方式定义函数会默认带一个self参数,代表当前table
print((a + b) .. ' SDHK????')
end
C#映射代码:
//接口映射 是 引用映射,这种方式依赖于生成代码,如果set属性也会设置对应的字段。甚至可以通过interface的方法访问lua的函数。
[CSharpCallLua]//用接口映射Lua表 需要加上这个特性,否则会报错
interface IPerson
{
string name { get; set; } //接口只能写函数
int age { get; set; }
void eat(int a, int b);
}
IPerson p = luaEnv.Global.Get<IPerson>("Person");//推荐
print(p.name + ":" + p.age);
轻量级映射
字典映射:
Dictionary<string, object> dict = luaEnv.Global.Get<Dictionary<string, object>>("Person");
foreach (var key in dict.Keys) //只映射出键值对
{
Debug.Log(key + ":" + dict[key]);
}
List映射:
List<object> list = luaEnv.Global.Get<List<object>>("Person");//只映射下标类型
foreach (var item in list)
{
Debug.Log(item);
}
LuaTable映射
消耗比较高
//这种方式好处是不需要生成代码,但也有一些问题,比如慢,比方式2要慢一个数量级,比如没有类型检查。
LuaTable tab = luaEnv.Global.Get<LuaTable>("Person");//消耗比较高
Debug.Log(tab.Get<string>("name"));
Debug.Log(tab.Get<int>("age"));
foreach (var item in tab.GetKeys())
{
Debug.Log(item);
}
函数映射
直接映射
Lua里的函数:
function add(a, b) --纯函数映射
print(a + b)
return a + b
end
C#映射代码:
[CSharpCallLua]//纯函数映射需要单独写委托和特性
delegate int add(int a, int b);
void Start()
{
add add = luaEnv.Global.Get<add>("add");//纯函数映射
print(add(1, 2));
add = null;//手动释放引用,不然Lua关闭时会报错
}
函数LuaFunction映射,代价比较大
LuaFunction func = luaEnv.Global.Get<LuaFunction>("add");
print(func.Call(1, 2)[0]);
Lua端:
函数方法调用
--调用u3d C# 方法,没有new,需要写全命名空间
CS.UnityEngine.GameObject('newLua')
--调用C#静态方法
print('访问静态' .. CS.UnityEngine.Time.deltaTime)
获取物体
local Box = CS.UnityEngine.GameObject.Find('newLua')
Box.name = 'Box'
获取组件和属性
Box:AddComponent(typeof(CS.UnityEngine.UI.Text))--CS添加组件
local text1 = Box:GetComponent('Text')--CS获取组件
text1.text = 'Lua写入'
--类型获取可以直接调用typeof
xlua object this[int index]{ get; set; }
C#的object this[int index] { get; set; } 对应的lua就是get_Item和set_Item
如果定义了委托,那么对于的+=和-=
就是add_委托的名称和remove_委托的名称