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

  • 相关阅读:
    Golang Web入门(3):如何优雅的设计中间件
    Golang Web入门(2):如何实现一个高性能的路由
    基于MySQL 的 SQL 优化总结
    Redis系列(七)Redis面试题
    Redis系列(六)Redis 的缓存穿透、缓存击穿和缓存雪崩
    Redis系列(五)发布订阅模式、主从复制和哨兵模式
    Redis系列(四)Redis配置文件和持久化
    Redis系列(三)Redis的事务和Spring Boot整合
    Redis系列(二)Redis的8种数据类型
    Redis系列(一)Redis入门
  • 原文地址:https://www.cnblogs.com/biu-we/p/15401147.html
Copyright © 2020-2023  润新知