XLuaHotFix研究

官网文档

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;

益益笔芯

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cchoop

有用的话请杯肥宅水

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值