zoukankan      html  css  js  c++  java
  • XLua热更新用法全流程总结(所有容易出问题的点)

    Xlua热更新流程总结


    本文提供全流程,中文翻译。

    Chinar 坚持将简单的生活方式,带给世人!

    (拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)


    Chinar —— 心分享、心创新!

    记录 Xlua 完成热更新流程

    为新手节省宝贵的时间,避免采坑!


    Chinar 教程效果:



    全文高清图片,点击即可放大观看 (很多人竟然不知道)


    1

    Description —— 描述


    Xlua 是腾讯出品的热更新方案

    由于其开源,且热更新方案简单易用,便于开发者对代码进行维护与修改,而得到广泛认可

    这里 Chinar Xlua 实现热更新的流程与坑进行一些记录与说明
    举个栗子黑白88


    2

    Xlua Import and Open Hotfix —— Xlua导入项目并且开启热更新


    导入 Xlua /到项目中后,我们需要在设置面板开启热更新才可以完全使用

    输入命令后,一定要回车,然后等待编译!
    举个栗子黑白88
    这里写图片描述


    3

    Generate and Inject Scripts —— 生成与注入脚本文件


    当工程中 Script /脚本文件有变更的时候

    例如增加/删除/增加标签[Hotfix]/增加函数标签[LuaCallCSharp]

    注意:只要有任何变动,就需要重新生成和注入脚本

    另外如果出现花式报错时,就清除所有,并重新生成和注入

    举个栗子黑白88
    这里写图片描述


    4

    Custom LuaLoader —— 自定义Loader


    为了测试在工程中调用 Lua 文件

    新建一个脚本 ChinarHotFix ,并挂载当前场景

    新建一个 Lua 文件放在一个目录下(因为我们自定义的Loader,是要指定该目录中的Lua文件的)

    注意:

    Lua文件的后缀名,要与函数中的 路径后缀 保持一致

    举个栗子黑白88

    C# 文件:

    using System.IO;
    using System.Text;
    using UnityEngine;
    using XLua;
    
    
    /// <summary>
    /// 热更新测试脚本——该脚本新建一个 Lua环境,并完成对 Lua脚本的指向调用
    /// </summary>
    public class ChinarHotFix : MonoBehaviour
    {
        private LuaEnv luaEnv; //声明一个Lua环境对象
    
    
        void Start()
        {
            luaEnv = new LuaEnv();                     //实例化一个
            luaEnv.AddLoader(ChinarLoader);            //添加Loader
            luaEnv.DoString("require'ChinarLuaTest'"); //引用名为: ChinarLuaTest 的 Lua 脚本
        }
    
    
        /// <summary>
        /// 自定义一个 Loader 
        /// </summary>
        /// <param name="luaFileName">Lua文件名</param>
        /// <returns>字节组</returns>
        private byte[] ChinarLoader(ref string luaFileName)
        {
            return Encoding.UTF8.GetBytes(File.ReadAllText(@"C:UsersAdministratorDesktopChinarXLuaDemoLuaFiles" + luaFileName + ".lua")); //读指定目录下的 Lua 文件,并返回字节组
        }
    }

    Lua 文件:

    print('Chinar')

    5

    Before the LuaEnv.Dispose —— 释放Lua环境之前


    运行后需要对 LuaEnv 环境进行释放

    释放 LuaEnv 之前还要反注册,那些注册到C#中的回调函数

    不然就会造成 LuaEnv 已经释放了,但是 Xlua 机制中的 Delegate 中的函数回调并没有被释放


    直接新建一个 Lua 脚本,专门管理并释放 Delegate 中的函数的释放

    例如:你通过Lua脚本 xlua.hotfix(CS.ChinarTest,'ChinarTestMethod',function) 注册到 C# 中的函数

    则通过新建一个 Lua 脚本ChinarDispose.lua,写上 xlua.hotfix(CS.ChinarTest,'ChinarTestMethod',nil) 质空,即可完成释放

    注意:每通过Lua脚本修改一个C#函数,都需要在ChinarDispose.lua脚本中添加对应函数的释放/删除操作
    举个栗子黑白88

    更改后,可进行双清、释放的 C# 文件:

    using System.IO;
    using System.Text;
    using UnityEngine;
    using XLua;
    
    
    /// <summary>
    /// 热更新测试脚本——该脚本新建一个 Lua环境,并完成对 Lua脚本的指向调用
    /// </summary>
    public class ChinarHotFix : MonoBehaviour
    {
        private LuaEnv luaEnv; //声明一个Lua环境对象
    
    
        void Start()
        {
            luaEnv = new LuaEnv();                     //实例化一个
            luaEnv.AddLoader(ChinarLoader);            //添加Loader
            luaEnv.DoString("require'ChinarLuaTest'"); //引用名为: ChinarLuaTest 的 Lua 脚本
        }
    
    
        /// <summary>
        /// 自定义一个 Loader 
        /// </summary>
        /// <param name="luaFileName">Lua文件名</param>
        /// <returns>字节组</returns>
        private byte[] ChinarLoader(ref string luaFileName)
        {
            return Encoding.UTF8.GetBytes(File.ReadAllText(@"C:UsersAdministratorDesktopXluaProjectsLuaFiles" + luaFileName + ".lua")); //读指定目录下的 Lua 文件,并返回字节组
        }
    
        /// <summary>
        /// 释放掉函数
        /// 此函数会在 OnDestroy 之前调用
        /// </summary>
        private void OnDisable()
        {
            luaEnv.DoString("require'ChinarDispose'");
        }
    
        /// <summary>
        /// 释放资源
        /// 此函数会在最后调用,物体被删除时
        /// </summary>
        private void OnDestroy()
        {
            luaEnv.Dispose();
        }
    
    
    }

    ChinarDispose.lua文件:

    xlua.hotfix(CS.ChinarTest,'ChinarTestMethod',nil)
    --xlua.hotfix(CS.ChinarTest1,'ChinarTestMethod1',nil)只要有修改C#中对应函数,都需要在这里完成释放操作
    --xlua.hotfix(CS.ChinarTest2,'ChinarTestMethod2',nil)
    --xlua.hotfix(CS.ChinarTest3,'ChinarTestMethod3',nil)

    6

    private Variable —— 私有变量


    正常情况,我们是无法直接通过 Lua 直接访问到 C# 中的私有变量的

    然而 Xlua 机制为我们提供了一个非常简便的解决方案

    当我们需要访问某个 C# 类中的私有变量时,只需要在 Lua 代码中加上一句话

    xlua.private_accessible(CS.ChinarTest)

    然后,我们就可以访问到 C# ChinarTest类中的私有变量了
    举个栗子黑白88

    更改后,可进行双清、释放的 C# 文件:

    using UnityEngine;
    using XLua;
    
    [Hotfix]
    public class ChinarTest: MonoBehaviour
    {
        private int Number = 666;//私有数字变量--例如这么一个私有变量
    }

    lua文件中加上:

    xlua.private_accessible(CS.ChinarTest)--只有加上这句话,才可以访问C#对应类中的私有变量

    支持

    May Be —— 搞开发,总有一天要做的事!


    拥有自己的服务器,无需再找攻略!

    Chinar 提供一站式教程,闭眼式创建!

    为新手节省宝贵时间,避免采坑!


    先点击领取 —— 阿里全产品优惠券 (享受最低优惠)


    1 —— 云服务器超全购买流程 (新手必备!)

    2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)

    3—— Windows 服务器配置、运行、建站一条龙 !

    4 —— Linux 服务器配置、运行、建站一条龙 !





    技术交流群:806091680 ! Chinar 欢迎你的加入


    END

    本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

    对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

    对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

  • 相关阅读:
    XML转义符简易版
    MarkDown语法
    判断javaScript变量是Ojbect类型还是Array类型
    Springboot实现VNC的反向代理
    MySql事务隔离的特点与实现
    MySql索引入门
    windows、Linux 批量执行 redis脚本命令
    iis 灰度发布
    iis 负载
    docker中部署.netcore2.2项目
  • 原文地址:https://www.cnblogs.com/chinarbolg/p/9601374.html
Copyright © 2011-2022 走看看