XLua基础

前言

  • 什么是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热补丁和腾讯支持,使用具体看需求。

posted @ 2021-10-20 18:28  人閒桂花落  阅读(167)  评论(0编辑  收藏  举报