前言
- 什么是XLUA
腾讯在2016年推出的一种Unity下Lua热更新解决方案,方便Lua与C#相互调用。 - Xlua和ToLua的区别
Tolua创建虚拟机,然后开始启动虚拟机,需要绑定。
Xlua创建虚拟机,然后就可以使用,没有后面的步骤。
两者除了动态绑定和xlua的热补丁,没有任何本质上的区别。
xLua与C#相互调用
LuaEnv luaEnv = new LuaEnv();//创建Lua虚拟机
luaEnv.DoString("require 'xlua'");//加载lua文件
- C#访问Lua全局变量
int a = luaEnv.Global.Get<int>("a");//获取到lua里面的全局变量 a
float b = luaEnv.Global.Get<float>("b");//获取到lua里面的全局变量b
string name = luaEnv.Global.Get<string>("name");//获取到lua里面的全局变量name
bool isTrue = luaEnv.Global.Get<bool>("isTrue");//获取到lua里面的全局变量isTrue
Debug.Log(isTrue);
luaEnv.Dispose();//释放虚拟机
- C#调用Lua全局函数
public delegate void MyCustomDelegateA();//无参数
MyCustomDelegateB deleA = luaEnv.Global.Get<MyCustomDelegateAA>("funA");
deleA();
[CSharpCallLua] //调用有参需要添加
public delegate int MyCustomDelegateB(int a,int b);//有参数
MyCustomDelegateB deleB = luaEnv.Global.Get<MyCustomDelegateAA>("funB");
int result = deleB(30,50);
Lua访问C#
CS.UnityEngine.Debug.Log("Xlua")
local go=CS.UnityEngine.GameObject()//创建游戏物体
local go1 = CS.UnityEngine.GameObject("Cube")//创建Cube对象
local button = Instantiate(self._btnFightInfo)//克隆Button
local Time = CS.UnityEngine.Time
loacal Com=camera.GetComponent(camera,"Camera")//获取组件
//映射结构体
public struct MyStruct{public string x;public string y;}
public void CSharpFunc(MyStruct p){Debug.Log(p.x);Debug.Log(p.y);}
myStructTable={a="C#",b="Lua"}
obj:CSharpFunc(myStructTable)
//Lua实现Awake Update OnDestroy
luaStart=runTable.Get<Action>("Awake")//Start调用
void Start(){if(null!=luaStart){luaStart();}}
//Lua
function Awake()
print("Awake")
end
//Update
luaUpdate=runTable.Get<Action>("Update")//Update调用
void Update(){if(null!=luaUpdate){luaUpdate();}}
//Lua
function Update()
print("Update")
end
//OnDestroy
luaOnDestroy=runTable.Get<Action>("OnDestroy")//OnDestroy调用
void OnDestroy(){if(null!=luaUpdate){luaOnDestroy();}}
function OnDestroy()
print("OnDestroy")
end
// 调用C#枚举
public enum State
{idle = 0,walk,run,attack}
local state = CS.State.idle//枚举使用的userdate自定义数据类型
print(CS.State.__CastFrom(1))//转换获得枚举
print(CS.State.__CastFrom("run"))
//调用C#事件
public delegate void EventLua();
public class TestEvent
{
public event EventLua luaEvent1;
public static event EventLua luaEvent2;
public static void Func()
{Debug.Log("静态事件");}
public static void CallEvent2()
{if (luaEvent2 != null)
luaEvent2(); }
public void CallEvent1()
{if (luaEvent1 != null)
luaEvent1();}
}
//静态事件
CS.TestEvent.luaEvent2("+",CS.TestEvent.Func)
CS.TestEvent.CallEvent2()
CS.TestEvent.luaEvent2("-",CS.TestEvent.Func)
//动态事件
local test = CS.TestEvent()
local func = function ()
test:luaEvent1("+",func)
test:CallEvent1()
test:luaEvent1("-",func)
结语
Tolua是效率较好,Xlua热补丁和腾讯支持,使用具体看需求。