zoukankan      html  css  js  c++  java
  • lua学习笔记4--XLua

    下载XLua:   https://github.com/tencent/xlua

    项目中使用XLua只需将Plugins和XLua两个文件夹拷贝到U3D中即可
    XLua只是核心,用于实现Lua和C#交互,但是并没有提供便捷的"框架",我们在项目中使用XLua的话,需要自己实现框架部分,这样才能实现"从服务器端下载AB和Lua资源,完成客户端的热更新"

    C#调用Lua
      using XLua;
      //一个LuaEnv实例就是一个Lua虚拟机,建议全局唯一
      LuaEnv luaEnv = new LuaEnv();
      luaEnv.DoString("print('test')");
         C#调用外部Lua代码文件

      luaEnv.DoString("require 'extraTestLua'");//默认路径是XLua/Resources,不需要写后缀
      在XLuaResources文件夹下创建lua文件,文件的后缀是txt;XLua中完整的Lua文件名格式:fileName.lua.txt

      

      
      C#获取Lua代码中的数据
      luaEnv.Global.Get<int>("a"); //获取lua中的数值
      luaEnv.Global.Get<string>("b"); //获取Lua中的字符串
      luaEnv.Global.Get<bool>("c"); //获取lua中的布尔
      luaEnv.Global.Get<LuaFunction>("d"); //获取lua中的方法

    Lua调用C#
      CS.UnityEngine.GameObject
      CS.UnityEngine.Debug.Log()
      CS.UnityEngine.GameObject.Find()
      //Lua调用C#,需要在C#的命名空间之前要加前缀: CS.

           //lua中不写new和泛型

           Lua语言中实例对象调用自身的方法要用":"号

           Lua语言中小树不需要加"f"后缀

         LuaEnv luaEnv = new LuaEnv();   //lua运行虚拟机
            //luaEnv.DoString("print('hellow')");
    
            luaEnv.DoString("require 'extraTestLua'");//C#调用外部Lua代码文件,不需要写路径和后缀
            int a = luaEnv.Global.Get<int>("a");                    //获取lua中的数值
            string b = luaEnv.Global.Get<string>("b");              //获取Lua中的字符串
            bool c = luaEnv.Global.Get<bool>("c");                  //获取lua中的布尔
            LuaFunction d = luaEnv.Global.Get<LuaFunction>("d");    //获取lua中的方法
            d.Call();
    
            string luaScript = @"
                local GameObject = CS.UnityEngine.GameObject
                local Debug = CS.UnityEngine.Debug
    
                local player = GameObject('xxxxx')
                Debug.Log(player.name)
           
                local camera = GameObject.Find('Main Camera')
                Debug.Log(camera.name)
            ";
            luaEnv.DoString(luaScript);

    XLua热补丁
    使用XLua来热更新的项目,原始项目在开发过程中全部用C#编写,不需要写Lua代码,能大大提高项目的开发效率,只有当项目中的功能需要热更新的时候才需要编写  Lua代码
    原始项目中出现了问题,写Lua代码进行修补,这种方式叫做"热补丁[HotFix]"
    *热补丁环境初始化步骤
      1.添加宏信息
      File-->Build Settings -->Player Settings -->ConfigurationScriptingDefineSymbols: HOTFIX_ENABLE

      2.执行菜单生成命令

      XLua->Generate Code该命令执行完毕后会生成一堆Wrap文件,存放到XLua/Gen文件夹下
      3.执行菜单注入命令
      XLua->Hotfix Inject In Editor
       成功之后会在控制台输出:"hotfix inject finish!"或"hotfix injected"
       如果不成功,需要把Tools文件夹拷贝到项目中,和Assets文件夹同级别位置
    热补丁
      1.HotFix特性标签
      在使用C#语言开发项目时,需要后续进行"热补丁修复"的类,需要在类的头部添加一个特性标签:[Hotfix],表示该类可以被XLua热修复
      2.Hotfix语法
      xlua.hotfix(CS.类名, '方法名', lua方法)
      这个是lua代码结构,需要使用Lua虚拟机对象中的DoString方法执行:某个类中的某个方法,使用lua方法进行修复
      注意:每次添加hotfix,需要重新注入命令
      有参方法修复时,需要传递当前脚本对象this,在lua中用self代替

    using UnityEngine;
    using XLua;
    
    [Hotfix]
    public class MyHotfix : MonoBehaviour
    {
        private string test = "test";
        void Start()
        {
            Hello();
            Add(1, 2);
        }
    
        private void Hello()
        {
            Debug.Log("C#: Hello" + test);
        }
    
        private void Add(int a, int b)
        {
            Debug.LogFormat("C#: a + b = {0}", a + b);
        }
    }
    using UnityEngine;
    using XLua;
    
    public class HotFixManager : MonoBehaviour
    {
        private LuaEnv luaEnv;
    
        void Start()
        {
            luaEnv = new LuaEnv();
            luaEnv.DoString("require 'luaFix'");
        }
    }
    --luaFix.lua.txt
    local
    Debug = CS.UnityEngine.Debug xlua.private_accessible(CS.MyHotfix) xlua.hotfix(CS.MyHotfix, 'Hello', function(self) Debug.Log('lua: Hello' + self.test) end) xlua.hotfix(CS.MyHotfix, 'Add', function(self, a, b) Debug.LogFormat("lua: a + b = {0}", a + b); end) print('XLua HotFix Over')

     

    Lua访问C#脚本内的字段
      1:可以在lua代码内通过"self.字段名"进行访问,但是这样有一个前提,该字段必须是public修饰的,private修饰的访问不到,但是这样有一个弊端,破坏了C#语言本身的封装性
      2:在lua语言中,使用代码获取C#类中private成员的访问权,可以在Lua脚本中访问到C#类当中的私有成员,同时不会破坏C#原有的封装性和逻辑关系.
      xlua.private_accessible(CS.类名)
      self.字段名 ....

    xlua.private_accessible(CS.MyHotfix)    --获取MyHotfix类中字段的private权限
    
    local GameObject = CS.UnityEngine.GameObject
    
    xlua.hotfix(CS.MyHotfix, 'CreateObject', function(self)
        GameObject.Instantiate(self.prefab, Vector3(0, 0, 0), Quaternion.identity);
    end)

    XLua默认是读取Resources文件夹下的Lua文件,但是Resources文件夹的特点是"文件压缩",并不适合Lua文件的热更新

    所以我们最好把Lua文件放到StreamingAssets文件夹下

    luaEnv.DoString("require 'luaFix'");//默认读取XLuaResources文件夹

    总结XLua Hotfix

     下载XLua

    将Assets里面的Plugins和XLua拷贝到项目,Tools拷贝到与Assets同级文件夹

    PlayerSetting里面将Scripting Define Symbols设置HOTFIX_ENABLE

    将需要热修复的类添加[Hotfix]特性,表示它可以热修复

     创建一个lua脚本,后缀为.lua.txt, 再添加热修复代码(这个就是热更新的文件,丢到服务器上下载就可以实现热修复)

     获取类:            CS.命名空间.类名

     获取类中字段的private权限:   xlua.private_accessible(类名)

     修复方法:           xlua.hotfix(CS.类名, '方法名', lua方法)

    再调用lua修复类

    LuaEnv luaEnv = new LuaEnv();
    luaEnv.DoString("require 'path'");//不写.lua.txt后缀
  • 相关阅读:
    堆的创建、优先队列、topk、堆排序C语言实现
    HTTPS加密原理
    go shard map实现
    Python进程间通信
    TCP 半连接队列和全连接队列
    WireShark过滤语法
    TCP拥塞机制
    【企业管理实务系列】低值易耗品管理办法
    CV之Face Change:基于人工智能实现国内众多一线美女明星换脸(基于Face++输出4*106个特征点定位+融合代码、deepfake技术)
    【转发】农行银企直联XML对接socket SAP EPIC
  • 原文地址:https://www.cnblogs.com/xianguoguo/p/11606532.html
Copyright © 2011-2022 走看看