目录
通过xLua运行Lua程序
导入网上下载的 xLua 包,其中也包涵示例代码和场景。
using XLua;
private LuaEnv luaenv;
void Start () {
//构建Lua虚拟机
luaenv = new LuaEnv();
//通过 Lua 语法(执行一个字符串)输出 Hello world
//luaenv.DoString("print('Hello world!')");
//通过 Lua 调用 C# 语法输出 Hello world
luaenv.DoString(" CS.UnityEngine.Debug.Log('Hello world') ");
}
private void OnDestroy()
{
luaenv.Dispose();
}
}
加载运行lua源文件
这里要注意一点 该文件的全名(包括后缀)为:helloworld.lua.txt
TextAsset ta = Resources.Load<TextAsset>("helloworld.lua");
LuaEnv env = new LuaEnv();
env.DoString(ta.text);
env.Dispose();
通过内置的 Loader 方法加载,比如,DoString(" require ‘byfile’ ")
LuaEnv env = new LuaEnv();
env.DoString("require 'helloworld'");
env.Dispose();
添加自定义的Loader方法
涉及到一个接口:
public delegate byte[] CustomLoader(ref string filepath);
public void LuaEnv.AddLoader(CustomLoader loader)
示例 :
void Start () {
LuaEnv env = new LuaEnv();
env.AddLoader(MyLoader);
env.DoString("require 'test'");
env.Dispose();
}
private byte[] MyLoader(ref string filePath)
{
string absPath = Application.streamingAssetsPath + "/" + filePath + ".lua.txt";
return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(absPath));
}
C#访问Lua
全局变量
要注意,获取的变量类型一定要对
LuaEnv luaEnv = new LuaEnv();
luaEnv.DoString("require 'CSharpCallLua'");
int a = luaEnv.Global.Get<int>("a");//获取到lua里面的全局变量 a
print(a);
string str = luaEnv.Global.Get<string>("str");//获取到lua里面的全局变量 str
print(str);
bool isDie = luaEnv.Global.Get<bool>("isDie");//获取到lua里面的全局变量 isDie
print(isDie);
luaEnv.Dispose();
Table
table 的名字为 person
person = {
name="MoGu",age=100 }
把访问到的 table 映射到 class
class Person
{
public string name;
public int age;
}
LuaEnv luaEnv = new LuaEnv();
luaEnv.DoString("require 'CSharpCallLua'");
Person p = luaEnv.Global.Get<Person>("person");
print(p.name+"-"+ p.age);
luaEnv.Dispose();
用这种方式访问到 table 后,对类中的值修改,是不会影响原来的 table 的。
把访问到的 table 映射到 interface
person = {
name="MoGu",age=100 ,
eat=function(self,a,b)
print(a+b)
end
}
需要给接口添加一个特性 [CSharpCallLua]
可以通过 interface 的方法访问 Lua 的函数
[CSharpCallLua]
interface IPerson
{
string name {
get; set; }
int age {
get; set; }
void eat(int a,int b);
}
LuaEnv luaEnv = new LuaEnv()