using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
public class CSharpCallLua : MonoBehaviour {
private static LuaEnv luaEnv = new LuaEnv();//创建Lua虚拟机
// Use this for initialization
void Start () {
luaEnv.DoString("require 'CSharpCallLua'"); //CSharpCallLua.lua.text文件存放在Resources或StreamingAssets里
//int age = luaEnv.Global.Get<int>("age");
//string name = luaEnv.Global.Get<string>("name");
//bool isTrue = luaEnv.Global.Get<bool>("IsTrue");
//print(age);
//print(name);
//print(isTrue);
//第一种方式,使用类
//类,值复制 类里面发生改变,不影响lua
//Person person = luaEnv.Global.Get<Person>("person");
//print(person.iAge + "-" + person.iName);\
//第二种方式,使用接口
//引用,值引用,C#发生改变影响Lua
/*
person=
{
age = 19,
name = "xp",
eat = function(arg, num1, num2) //由于lua机制 没有this,所以传入arg,在CSharp中已经默认传入
print(num1 + num2)
end
}
--另外两种方式
--function person:eat(num1, num2)
-- print(num1 + num2)
--end
--function person.eat(arg, num1, num2)
-- print(num1 + num2)
--end
*/
//IPerson person = luaEnv.Global.Get<IPerson>("person");
//print(person.age);
//person.age = 18;
//print(person.age);
//person.eat(1, 2);
//第三种方式,使用Dictonary和List,
//Dictionary<string , object> dictonary = luaEnv.Global.Get<Dictionary<string, object>>("person");
//foreach(string key in dictonary.Keys)
//{
// print(key + "-" + dictonary[key]);
//}
//Dictionary缺陷:只映射键值对类型
//List缺陷:只映射范型制定类型
//List<int> list = luaEnv.Global.Get<List<int>>("person");
//foreach(object item in list)
//{
// print(item);
//}
//第四种方法使用LuaTable,性能比第二种方法低,没有类型检查
//LuaTable luaTable = luaEnv.Global.Get<LuaTable>("person");
//int age = luaTable.Get<int>("age");
//string name = luaTable.Get<string>("name");
//print(age);
//print(name);
//调用Lua 的function方法 通过代理,效率更高
//int rest1 = 0;
//int rest2 = 0;
//Add add = luaEnv.Global.Get<Add>("Add");
//int result = add(1, 2, out rest1, out rest2);
//print(result);
//print(rest1);
//print(rest2);
//add = null;//索引置空,否则无法释放()
//通过LuaFunction调用Lua方法 ,该方法效率比较低,每次调用映射消耗性能,推荐用代理方法
LuaFunction luaFunction = luaEnv.Global.Get<LuaFunction>("Add");
object[] os = luaFunction.Call(1, 2);
foreach(object o in os)
{
print(o);
}
luaEnv.Dispose();
}
[CSharpCallLua]
delegate int Add(int num, int num2, out int rest1, out int rest2);//当有三个返回值时,out 可以接受后面几个返回值
[CSharpCallLua]
interface IPerson{
int age{ get;set;}
int name { get; set;}
void eat(int num1, int num2);
}
//class Person{
// public int iAge;
// public string iName;
//}
}
XLlua使用之C#访问lua
最新推荐文章于 2023-09-24 18:06:34 发布