1.直接用Lua调用C#的方法 使用XLua输出HelloWorld 引入命名空间XLua,声明一个LuaEnv的类的对象,这个类提供了一些方法
代码语言:javascript复制using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
public class HellowWorld01 : MonoBehaviour {
private LuaEnv luaenv;
void Start () {
luaenv = new LuaEnv();
luaenv.DoString("print('hello world')");
//luaenv.DoString("CS.UnityEngine.Debug.Log('hello kk')");
}
private void OnDestroy()
{
luaenv.Dispose();
}
}
输出结果:
LUA: hello world
2.通过读取Lua文件执行Lua语句
代码语言:javascript复制//加载helloWorld.lua.txt,TextAsset会自动加txt的后缀
TextAsset ta = Resources.Load<TextAsset>("helloWorld.lua");
//print(ta);
LuaEnv luaEnv = new LuaEnv();
luaEnv.DoString(ta.text);
luaEnv.Dispose();
3.自定义Loader 在xLua加自定义loader是很简单的,只涉及到一个接口: public delegate byte[] CustomLoader(ref string filepath); public void LuaEnv.AddLoader(CustomLoader loader)
代码语言:javascript复制通过AddLoader可以注册个回调,该回调参数是字符串,lua代码里头调用require时,参数将会透传给回调,回调中就可以根据这个参数去加载指定文件,如果需要支持调试,需要把filepath修改为真实路径传出。该回调返回值是一个byte数组,如果为空表示该loader找不到,否则则为lua文件的内容。
public class CreateLoader : MonoBehaviour {
private LuaEnv luaEnv;
// Use this for initialization
void Awake () {
luaEnv = new LuaEnv();
luaEnv.AddLoader(MyLoader);
luaEnv.DoString("require 'helloWorld.lua'");
luaEnv.Dispose();
}
private byte[] MyLoader(ref string filePath)
{
string s = "print('best kk')";
return System.Text.Encoding.UTF8.GetBytes(s);
}
}
4.读取非Resources文件夹下的lua文件通过自定义Loader
代码语言:javascript复制public class CreateLoader : MonoBehaviour {
private LuaEnv luaEnv;
void Awake () {
luaEnv = new LuaEnv();
luaEnv.AddLoader(MyLoader);
luaEnv.DoString("require 'test007'");
luaEnv.Dispose();
}
private byte[] MyLoader(ref string filePath)
{
print(filePath);
print(Application.streamingAssetsPath);
string path = Application.streamingAssetsPath "/" filePath ".lua.txt";
return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(path));
}
}
C#访问Lua
一.获取Lua中的全局变量
代码语言:javascript复制int a = luaEnv.Global.Get<int>("a");
print(a);
二.访问一个全局的Table 在C#中定义一个类与Lua中的Table相对应
代码语言:javascript复制 class Person
{
public string name;
public int age;
}
在用这个类创建对象来进行接收
代码语言:javascript复制Person kk = luaEnv.Global.Get<Person>("person");
print(kk.name " " kk.age);
2.使用接口访问Table 声明一个接口,添加CSharpCallLua的特性
代码语言:javascript复制[CSharpCallLua]
interface IPerson
{
string name { get; set; }
int age { get; set; }
}
使用接口将获取Lua文件中的引用,这与通过声明类不同,修改实例化的接口将直接修改Lua中的数据。 在接口中声明方法将直接对应Lua中Table中的方法。
代码语言:javascript复制person = {
name = "kk";
age = 23;
eat = function()
print("111");
end
}
代码语言:javascript复制[CSharpCallLua]
interface IPerson
{
string name { get; set; }
int age { get; set; }
void eat();
}
3.使用轻量级的映射方式字典或者集合 将Lua中Table的键值对存在Dictionary中,存在限制,没有明确的键的无法存在Dictionary中。
代码语言:javascript复制Dictionary<string, object> dic = luaEnv.Global.Get<Dictionary<string,object>>("person");
foreach (string item in dic.Keys)
{
print(item " " dic[item]);
}
将Lua中Table的键值对存在List中,List中只能存没有明确键的。只能映射值,没有key的。
代码语言:javascript复制List<object> list = luaEnv.Global.Get<List<object>>("person");
foreach (var item in list)
{
print(item);
}
4.另一种by ref方式:映射到LuaTable类
代码语言:javascript复制LuaTable luaTable = luaEnv.Global.Get<LuaTable>("person");
print(luaTable.Get<string>("name"));
print(luaTable.Get<string>("age"));
三.访问一个全局的function 1.映射到delegate 在C#中delegate的参数与Lua中的funciton的参数对应即可
代码语言:javascript复制Action act1 = luaEnv.Global.Get<Action>("add");
act1();
act1 = null;//释放对Lua的引用
在Lua中的方法需要传参的时候:
代码语言:javascript复制function add(a,b)
print(a b);
end
在定义委托的时候就用delegate并添加CSharpCallLua的特性
代码语言:javascript复制[CSharpCallLua]
delegate void Add(int a, int b);
接受返回值:
代码语言:javascript复制function add(a,b)
print(a b);
return 666;
end
代码语言:javascript复制[CSharpCallLua]
delegate int Add(int a, int b);
多返回值 使用ref或out参数接受多的返回值
代码语言:javascript复制function add(a,b)
print(a b);
return 666,a,b;
end
代码语言:javascript复制 [CSharpCallLua]
delegate int Add(int a, int b,out int resa,out int resb);
代码语言:javascript复制Add add = luaEnv.Global.Get<Add>("add");
//print (add(3, 2));
int resa;
int resb;
int ans = add(6,9,out resa,out resb);
print(resa "__" resb);