lua文件放在Resources目录下CShapeCallLua.lua.txt
a=10
b="stringTest"
c=true
Unity中这样去获取这三个全局变量
using UnityEngine;
using XLua;
public class CShapeCallLua : MonoBehaviour {
LuaEnv luaEnv;
// Use this for initialization
void Start () {
luaEnv = new LuaEnv();
luaEnv.DoString("require 'CShapeCallLua'");
var a= luaEnv.Global.Get<int>("a");
var b= luaEnv.Global.Get<string>("b");
var c = luaEnv.Global.Get<bool>("c");
print(a);
print(b);
print(c);
luaEnv.Dispose();
}
}
控制台也是正常输出了三个值
上面的三个值都是类型比较简单的值,那怎么取出table的值呢
先在lua中定义一个table
student={
name="fluency",
age=21
}
1. 第一种方法使用 Class 或 struct
这种方法虽然简单,但是开销比较大,而且在C#或者Lua中修改了table的值,互相都不传递这个值
C#中定义一个相同的class或struct
public struct Student
{
public string name;
public int age;
}
using UnityEngine;
using XLua;
public class CShapeCallLua : MonoBehaviour
{
LuaEnv luaEnv;
// Use this for initialization
void Start()
{
luaEnv = new LuaEnv();
luaEnv.DoString("require 'CShapeCallLua'");
var student = luaEnv.Global.Get<Student>("student");
print(student.name + " " + student.age);
luaEnv.Dispose();
}
}
2. 使用Interface
需要给接口添加特性[CSharpCallLua]
可以通过接口修改Table内的属性
可以通过接口访问Table中的函数
给table添加了一个带参数的函数
student={
name="fluency",
age=21,
skill=function(self,a,b)
print(a+b)
print("我会飞")
end
}
定义接口,这次使用接口访问
[CSharpCallLua]//需要拥有这个特性才可以访问lua
interface IStudent
{
string name { get; set; }
int age { get; set; }
void skill(int a,int b);
}
using UnityEngine;
using XLua;
public class CShapeCallLua : MonoBehaviour
{
LuaEnv luaEnv;
// Use this for initialization
void Start()
{
luaEnv = new LuaEnv();
luaEnv.DoString("require 'CShapeCallLua'");
var student = luaEnv.Global.Get<IStudent>("student");
print(student.name + " " + student.age);
student.skill(1,2);//调用table的函数
student.name = "LiuChang";//修改lua内table的值
luaEnv.DoString("print(student.name)");//查看修改后的值
luaEnv.Dispose();
}
}
3. 使用Dictionary和List
局限性比较大,Dictionary只能取出带有key的值,List只能取出没有key的值
如果表内数据比较符合这个需求,就可以使用Dictionary和List
DIctionary表
dic={
a=1,b=2,c=3,d=true,e="dicstr"
}
var dic = luaEnv.Global.Get<Dictionary<string,object>>("dic");
foreach (var item in dic)
{
print(item.Key + " - " + item.Value);
}
List表
listtable={
1,3,4,false,"liststr",0.1
}
var list = luaEnv.Global.Get<List<object>>("listtable");
foreach (var item in list)
{
print(item);
}
4. 通过XLua内置的方法LuaTable来获取
这个方法不常用,虽然可以不用生成代码,但是在速度上和interface不在一个级别
var tab = luaEnv.Global.Get<LuaTable>("student");
print(tab.Get<string>("name"));
print(tab.Get<int>("age"));
最后还是推荐使用第二种方式来读取