该代码是基于XLua,XLua插件下载链接:https://github.com/Tencent/xLua
代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using XLua; using System; public class CSharpCallLua : MonoBehaviour { private LuaEnv m_luaEnv; class Person { public string name; public int age; public int age2; } //使用接口类时必须加特性[CSharpCallLua] [CSharpCallLua] interface IPerson { string name { get; set; } int age { get; set; } void state(int a, int b); } // Use this for initialization void Start () { m_luaEnv = new LuaEnv(); m_luaEnv.DoString("require 'CSharpCallLua'"); //获取lua脚本中的全局变量 int a = m_luaEnv.Global.Get<int>("a"); //当a为小数时,此时用float或者double类型 string str = m_luaEnv.Global.Get<string>("str"); bool isLove = m_luaEnv.Global.Get<bool>("isLove"); //int b = m_luaEnv.Global.Get<int>("b"); //当获取lua脚本中的变量不存在时报的错为 Error: can not assign nil to System.Int32 print(a + str + isLove); print("值拷贝 :"); //获取lua脚本中的table(映射到class,struct) 这个过程是值拷贝,如果class比较复杂代价比较大, //而且修改class字段值不会同步到lua脚本中,反过来也不会(推荐使用) Person person = m_luaEnv.Global.Get<Person>("Person"); person.name = "shenxichen"; m_luaEnv.DoString("print(Person.name)"); print("引用 :"); //获取lua脚本中的table(映射到interface) 这个过程是引用(推荐使用) IPerson iperson = m_luaEnv.Global.Get<IPerson>("Person"); iperson.name = "shenxichen"; iperson.state(15, 16); // iperson.state(iperson, 15, 16) m_luaEnv.DoString("print(Person.name)"); print("Dictionary :"); //访问lua脚本中的Dictionary或者List Dictionary<string, object> dic = m_luaEnv.Global.Get<Dictionary<string, object>>("Person"); foreach (string key in dic.Keys) { print(key + "-" + dic[key]); } print("List :"); List<object> objList = m_luaEnv.Global.Get<List<object>>("Person"); foreach (object obj in objList) { print(obj); } print("LuaTable :"); //通过LuaTable访问Table,性能比较慢,不推荐使用 LuaTable luaTable = m_luaEnv.Global.Get<LuaTable>("Person"); print(luaTable.Get<int>("age")); print(luaTable.Get<string>("name")); print("001 :"); //访问Lua中的全局function Action action1 = m_luaEnv.Global.Get<Action>("add"); //不带参的方式 action1(); action1 = null; //这里action为引用,不置空m_luaEnv无法释放 Sum sum = m_luaEnv.Global.Get<Sum>("Sum"); //带参的方式 int s = sum(12, 23); sum = null; print(s); print("LuaFunction :"); //通过LuaFunction访问Lua中的function,不推荐使用,耗性能 LuaFunction luaFunction = m_luaEnv.Global.Get<LuaFunction>("Sum"); object[] objAry = luaFunction.Call(12, 23); foreach (object obj in objAry) { print(obj); } } //通过委托映射时必须加特性[CSharpCallLua] [CSharpCallLua] delegate int Sum(int a, int b); //delegate int Sum(int a, int b, out int resa, out int resb),用out或者ref接收多余的返回值 // Update is called once per frame void Update () { } private void OnDestroy() { m_luaEnv.Dispose(); } }
Lua脚本如下:
print("My Love") a = 1017 str = "sy" isLove = false Person = { name = "shenyang", age = 123, 2,3,4,5,12122,false,3.3,"sy", state = function(self, a, b) --lua函数里第一个参数代表自身,必填 print(a + b); print("我爱你"); end } --[[" function Person: state(a, b) --默认带一个self参数,代表当前table print(a + b); print("我爱你"); end "]] --[[" function Person.state(self, a, b) print(a + b); print("我爱你"); end "]] function add() print("add"); end function Sum(a,b) --Lua可以允许多个返回值 print(a+b); return a+b,a,b; end