该代码是基于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