1.HotFix配置
1、打开该特性
添加HOTFIX_ENABLE宏(各个平台)
2、执行XLua/Generate Code菜单。
3、注入,构建手机包这个步骤会在构建时自动进行,编辑器下开发补丁需要手动执行"XLua/Hotfix Inject In Editor"菜单。
打印“hotfix inject finish!”或者“had injected!”才算成功,否则会打印错误信息。
错误: please install the Tools
解决:未找到XLuaHotfixInject.exe,需从官网下载最新把Tools文件夹放在Project目录下)
2.标识热更类型
方式一: 直接在类里头打Hotfix标签(不建议,高版本unity不支持)
方式二: 在一个static类的static字段或者属性里头配置一个列表。属性可以用于实现的比较复杂的配置,比如根据Namespace做白名单。
注意放在Editor目录下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using XLua;
//如果涉及到Assembly-CSharp.dll之外的其它dll,如下代码需要放到Editor目录
public static class HotfixCfg
{
[Hotfix]
public static List<Type> by_field = new List<Type>()
{
typeof(XLuaHotfixTest),
};
[Hotfix]
public static List<Type> by_property
{
get
{
//Namespace白名单
return (from type in Assembly.Load("Assembly-CSharp").GetTypes()
where type.Namespace == "XXXX"
select type).ToList();
}
}
}
注意添加完新的热更类型,需重新Generate Code并且注入
3.lua热补丁使用方式
方法一: xlua.hotfix(class, [method_name], fix)
class表示热更新类
method_name表示方法名(可选)
fix表示lua补丁方法(如果method_name为空,可以是一个键值对的方法table(method_name = function),key就是方法名,一般要热补丁整个类可以这样写)
调用父类方法:base(self):Test§ --调用父类的方法,没有会报错
示例:
xlua.hotfix(CS.XLuaHotfixTest, ‘Test’, function(self, p)
Log.Error(“热更新测试”)
– base(self):Test§ --调用父类的方法,没有会报错
end)
方法二:util.hotfix_ex(class, method_name, fix)
与方法一的区别是可以执行原来的函数,但是fix的执行会略慢。
调用方式:self:Test() --调用原方法
local xluaUtil = require(“xlua.util”)
xluaUtil.hotfix_ex(CS.XLuaHotfixTest, ‘Test’, function(self, p)
self:Test() --调用原方法
Log.Error(“热更新测试”)
end)
CS.XLuaHotfixTest.Instance:Test()
4.热更新类型范围限制
1.不支持静态构造函数。
public class TextXXX
{
static TextXXX()
{
}
}
2.目前只支持Assets下代码的热补丁,包括Assets下的dll
3.不支持引擎,c#系统库的热补丁。
比如UnityEngine.dll下的代码都不支持热补丁
5.报错信息解决
Hotfix配置时错误: please install the Tools
解决:未找到XLuaHotfixInject.exe,需从官网下载最新把Tools文件夹放在Project目录下)
执行xlua.hotfix时报错xlua.access, no field __Hitfix0_Update
该类没配置到Hotfix列表或者未编译注入注入(点击Generate Code和Hotfix Inject In Edito)
6.热补丁官方使用建议
- 对所有较大可能变动的类型进行热更新标适;
- 建议用反射找出所有函数参数、字段、属性、事件涉及的delegate类型,标注CSharpCallLua;
- 业务代码、引擎API、系统API,需要在Lua补丁里头高性能访问的类型,加上LuaCallCSharp;
- 引擎API、系统API可能被代码剪裁调(C#无引用的地方都会被剪裁),如果觉得可能会新增C#代码之外的API调用,这些API所在的类型要么加LuaCallCSharp,要么加ReflectionUse;
益益笔芯