using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
using System;
public class CSharp2Lua : MonoBehaviour
{
private void Start()
{
LuaEnv luaenv = new LuaEnv();
luaenv.DoString("require 'C#2Lua'");//这行之后可以取到txt中的变量 注意number和int float double 类型的匹配
//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);
//第一种方式 class映射
//Preson p = luaenv.Global.Get<Preson>("preson");//得到表
//print(p.name + "-" + p.age);//值拷贝,比较耗费性能
//p.name = "zxw1";//如果在此处修改表中的值,Lua中的值不会发生改变,反过来,在Lua中修改值也不会改变此处的值
//luaenv.DoString("print(person.name)");//如果在此处修改表中的值,Lua中的值不会发生改变,反过来,在Lua中修改值也不会改变此处的值
//第二种方法 interface映射(主流)
//IPreson p = luaenv.Global.Get<IPreson>("preson");
//print(p.name + "-" + p.age);
//p.name = "zxwss";//可以在此处修改表中的值,Lua中的值可以被修改,相当于引用
//luaenv.DoString("print(preson.name)");//可以在此处修改表中的值,Lua中的值可以被修改,相当于引用
//p.eat(19,6);//p.eat(self.19.6) 在Lua中需要多一个参数,self,是它的本身 ,而在C#中则不需要
//第三种方法 Dictionary或List
//通过Dictionary映射 无法映射没有Key的值
//Dictionary<string, object> dict = luaenv.Global.Get<Dictionary<string, object>>("preson");//得到字典
//foreach(string key in dict.Keys)//遍历字典中的值
//{
// print(key + "-" + dict[key]);//输出键值对
//}
//通过List映射 只能映射表中没有Key的值
//List<object> list = luaenv.Global.Get<List<object>>("preson") //得到List集合
//foreach (object o in list)
//{
// print(o);
//}
//第四种方法 通过LuaTable
//LuaTable tab = luaenv.Global.Get<LuaTable>("preson");//得到LuaTable
//print(tab.Get<string>("name"));
//print(tab.Get<int>("age"));
//调用Lua中的全局函数
//Action act = luaenv.Global.Get<Action>("add");//映射函数(委托) 需要引入using System;
//act();
//act = null;//释放函数
//1.映射到delegate
//Add add = luaenv.Global.Get<Add>("add");//得到add委托
//int res_;
////int res_=0; //ref参数需要赋初值
//int res = add(19, 6,out res_);
//print(res);
//print(res_);
//add = null;//释放委托
//2.映射到LuaFunciton 代价较大 减少调用次数
LuaFunction func = luaenv.Global.Get<LuaFunction>("add");
object[] os = func.Call(19, 6);//传入的参数为19,6
foreach(object o in os)
{
print(o);
}
luaenv.Dispose();
}
[CSharpCallLua]//添加特性
delegate int Add(int a, int b,out int res);//定义委托 用out/ref参数来接收Lua中大于一个的返回值
class Preson//第一种方式
{
public string name;
public int age;
public int age2;//此处是空映射,如果输出空映射,则返回0,而不是nil
}
[CSharpCallLua]//添加特性
interface IPreson//第二种方式 接口不能包含字段,必须声明为get set方法
{
string name { get; set; }
int age { get; set; }
void eat(int a, int b);
}
}
下面是Lua脚本
a=100
str="zxw"
isDie=false
preson={
name="zxw",age=19,2,3,1,
eat=function(self,a,b)
print(a+b)
end
}
function add(a,b)
print(a+b)
return a*b,a-b
end