XLua学习心得

一、XLua简介
XLua作为腾讯近年来一大开源贡献,受到了业界的广泛好评。除了常规的Lua绑定植物,最重要的就是代码热补丁。
在这里插入图片描述

官网:
https://github.com/Tencent/xLua
配置文档:
https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.md
官方FAQ:
https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/faq.md
代码生成引擎:
https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/custom_generate.md
Lua5.3官方手册:
https://www.lua.org/manual/5.3/manual.html

二. xlua热更新

1. 添加XLua到工程中,github下载后,将 xlua-master/Assets下的内容拷贝到我们的工程里,
之后制作热更新的时候需要使用tools文件夹下的XLuaHotfixInject.exe 文件,直接将tools文件也整个拷贝到工程里,在真实的项目里大家根据需求有选择的拷贝就好。另外有一点需要注意的是,全拷贝tools文件夹下的内容到工程里的话,Unity会报出重复定义的错误:
在这里插入图片描述
此时,将tools里的 System.Core.dll 删除就可以了。
2. 在BuildSettings里添加两个宏:

  • HOTFIX_ENABLE:

开启热更新特性,编辑器,各手机平台需要手动单独设置,如果是自动化打包,要注意在代码里用API设置的宏是不生效的,需要在编辑器里设置。

  • INJECT_WITHOUT_TOOL:

采用内嵌到编辑器的方式注入。添加了该宏之后,在菜单栏XLUA里才能够进行【Hotfix inject in Editor】的操作;在构建手机包的时候这个步骤会在构建时自动进行,编辑器模式下开发补丁需要手动执行Hotfix inject in Editor进行注入。
定义INJECT_WITHOUT_TOOL宏后,热补丁特性依赖Cecil,添加HOTFIX_ENABLE宏之后,可能会报找不到Cecil。这时你需要到Unity安装目录下找到Mono.Cecil.dll,Mono.Cecil.Pdb.dll,Mono.Cecil.Mdb.dll,拷贝到项目里头。
注意:如果你的Unity安装目录没有Mono.Cecil.Pdb.dll,Mono.Cecil.Mdb.dll(往往是一些老版本),那就只拷贝Mono.Cecil.dll(你从别的版本的Unity拷贝一套可能会导致编辑器不稳定),这时你需要定义HOTFIX_SYMBOLS_DISABLE,
这会导致C#代码没法调试以及Log的栈源文件及行号错乱(所以赶紧升级Unity)。

  • 以上两个宏若是不开启,或者在没有成功进行Hotfix inject in Editor操作直接运行的话,系统会抛出 LuaException: xlua.access, no field __Hotfix0_hotfix
  1. 对需要热更的代码部分添加[Hotfix]标签,
    这样xLua就知道这个类或者方法等可能会有热更新的需求。
using UnityEngine;
using System.Collections;
using XLua;
 
[Hotfix]
public class HotfixTest_easy{
 
    public void HotFixEasy()
    {
        Debug.Log("Unity调用");
    }
}

4. Unity侧的调用:

using UnityEngine;
using System.Collections;
using XLua;
 
public class HotFixMono : MonoBehaviour {
 
    XLua.LuaEnv m_kLuaEnv = null;
 
    private HotfixTest_easy fixEasy = null;
        // Use this for initialization
    private bool isShow = false;
        void Start () {
 
        //代码热更步骤
        m_kLuaEnv = new LuaEnv();  //该变量最好保证全局就此一个
 
        //1.查找指定路径下lua热更文件
        TextAsset txt = Resources.Load("HotfixTest_easy.lua") as TextAsset;
 
        //2.如果存在lua热更文件,则执行lua文件的执行,否则不执行(也就是说,到底是读取C#本地代码还是LUA热更代码是由我们自己控制,xlua框架并不提供识别机制,这只是我现在的个人理解,如果不正确,请一定要告知我!)
        if (txt != null)
        {
            m_kLuaEnv.DoString(txt.text, "HotfixTest_easy.HotFixEasy");  //这个方式是替换指定的方法
        }
 
        fixEasy = new HotfixTest_easy();
        }
         
        // Update is called once per frame
    void Update()
    {
 
        if (!isShow)
        {
            isShow = true;
            fixEasy.HotFixEasy();
        }
        }
}

5.几个重要的XLua API

HotfixTest_easy = {}

function HotfixTest_easy.HotFixEasy()
        print("xxxxxxx lua cast")
end;

xlua.private_accessible(CS.HotfixTest_easy)
xlua.hotfix(CS.HotfixTest_easy,'HotFixEasy',HotfixTest_easy.HotFixEasy)

xlua.hotfix(class, [method_name], fix)
描述 : 注入lua补丁
class : C#类,两种表示方法,CS.Namespace.TypeName或者字符串方式"Namespace.TypeName",字符串格式和C#的Type.GetType要求一致,如果是内嵌类型(Nested Type)是非Public类型的话,只能用字符串方式表示"Namespace.TypeName+NestedTypeName";
method_name : 方法名,可选;
fix : 如果传了method_name,fix将会是一个function,否则通过table提供一组函数。table的组织按key是method_name,value是function的方式。

xlua.private_accessible(class)

描述 : 让一个类的私有字段,属性,方法等可用
class : 同xlua.hotfix的class参数

util.hotfix_ex(class, method_name, fix)
描述 : xlua.hotfix的增强版本,可以在fix函数里头执行原来的函数,缺点是fix的执行会略慢。
method_name : 方法名;
fix : 用来替换C#方法的lua function。

6. 执行xlua/Generate Code—>执行XLua/Hotfix Inject In Editor
执行后者的时候,因为XLUA源代码里需要找到 XLuaHotfixInject.exe(tools里)才能运行,需要收到修改代码里找到该文件的路径

最后运行,当热更目录(为了方便暂时放在Resource文件夹下)里不存在指定的文件时,则执行C#定义的方法:
在这里插入图片描述
在这里插入图片描述

当存在指定的文件时,则进行热更新的操作:
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值