根据官方说法,想用lua覆写C#代码进行热更有两种打标签方法:

一种是:在想用lua覆写的C#代码的类上写上[Hotfix]代码;(官方不推荐)

二种是:写一个静态集合字段,集合里包含你所要覆写的所有类。字段要写在静态类里,静态类文件要放在Editor文件夹里。

接写来请各位看官看我表演!

 腾讯官方文档地址:

 xLua/hotfix.md at master · Tencent/xLua · GitHub

 不管哪一种,都有公共的操作:

  • 1、打开该特性

添加HOTFIX_ENABLE宏,(在Unity3D的File->Build Setting->Scripting Define Symbols下添加)。编辑器、各手机平台这个宏要分别设置!如果是自动化打包,要注意在代码里头用API设置的宏是不生效的,需要在编辑器设置。

(建议平时开发业务代码不打开HOTFIX_ENABLE,只在build手机版本或者要在编译器下开发补丁时打开HOTFIX_ENABLE)

  • 2、执行XLua/Generate Code菜单。
  • 3、注入,构建手机包这个步骤会在构建时自动进行,编辑器下开发补丁需要手动执行"XLua/Hotfix Inject In Editor"菜单。打印“hotfix inject finish!”或者“had injected!”才算成功,否则会打印错误信息。

如果已经打印了“hotfix inject finish!”或者“had injected!”,执行xlua.hotfix仍然报类似“xlua.access, no field __Hitfix0_Update”的错误,要么是该类没配置到Hotfix列表,要么是注入成功后,又触发了编译,覆盖了注入结果。

一、首先来演示第一种打标签方式

1. 从腾讯官方的GitHub中下载下来Xlua项目文件后,Unity创建个空项目,把Xlua安装代码(下面这两个文件夹:Assets、Tools)复制到对应的项目文件夹中:

unity设置为静态的 unity勾选静态_游戏引擎

                                        

unity设置为静态的 unity勾选静态_游戏引擎_02

 

 2. 然后进入unity,写上HOTFIX_ENABLE特性。

3. 然后创建两个C#脚本文件Mains.cs和Moves.cs,Main的功能主要是可以加载xlua文件,Move主要功能就是用来被xlua覆写里面的方法,挂在到Unity场景里的一个物体上,比如相机上。

unity设置为静态的 unity勾选静态_unity设置为静态的_03

 

unity设置为静态的 unity勾选静态_unity_04

 

unity设置为静态的 unity勾选静态_lua_05

 可以看到Main类里面写了两行调用xlua命令文件hotfix的代码。

4. 打[Hotfix]标签。要想moves里面的方法可以被xlua覆写,需要在moves类上写上[Hotfix]标签:

unity设置为静态的 unity勾选静态_覆写_06

 5. 打好标签之后,来创建个hotfix.lua.txt文本文件,里面写xlua覆写Moves类里面Update方法的代码。这个文件放在Resources文件夹下。

unity设置为静态的 unity勾选静态_游戏引擎_07

 这个lua代码文件后边得带上.lua字符,否则调用不了。

6.接下来就执行代码生成(也就是官方第2步)。这个命令在GitHub项目文件复制之后会显示在菜单栏里:

unity设置为静态的 unity勾选静态_lua_08

 生成成功后,会打印结果,并在Assets->Xlua文件夹下创建一个Gen文件夹用来存放生成的C#脚本。

unity设置为静态的 unity勾选静态_覆写_09

 7. 接下来把生成的代码注入到Editor 里:

unity设置为静态的 unity勾选静态_lua_10

 成功之后同样会有提示:

unity设置为静态的 unity勾选静态_lua_11

 8. 准备完毕,接下来就运行试试吧:

unity设置为静态的 unity勾选静态_lua_12

 运行结果显示,我们的覆写是成功的!真开心!哈哈哈,整个世界都变得温柔了起来呢。

 二、接下来演示第二种打标签方式

1. 我们不用在Moves类上写[Hotfix]标签,这样就可避免很多累人的活,也是官方推荐的写法。哈哈哈。

只需要在Editor文件夹下写个脚本,里面是个静态的类,类里面有个静态集合字段,字段里装上需要被覆写的类。

unity设置为静态的 unity勾选静态_游戏引擎_13

unity设置为静态的 unity勾选静态_覆写_14

 

unity设置为静态的 unity勾选静态_unity_15

 下面这个by_property也可以设置那些类需要覆写,这里没有设置,我们只需要关注上面的by_fields字段,这个字段里就包含了Moves类,意思就是让Moves类可以被覆写。当然这个字段名by_fields是可以随便写的,哈哈哈。

2. 回到unity,清除生成的脚本文件,重新生成并注入。

unity设置为静态的 unity勾选静态_unity设置为静态的_16

unity设置为静态的 unity勾选静态_游戏引擎_17

3. 好了老铁,让我们再次运行试试吧

unity设置为静态的 unity勾选静态_lua_18

好吧,不成功,哈哈哈。 

4. 问题排查,让我看看什么原因呢?

①这个提示应该说的是找不到Update方法,到这找不到,说明类Moves是找到了的,那说明我们生成代码是成功的,难道是没有注入成功,都已经提示成功了,再试一下吧。

unity设置为静态的 unity勾选静态_游戏引擎_19

刚才我又试了n遍还是不行。哈哈哈。

刚才我又试了生成并注入n遍也是不行。哈哈哈。

 不对呀,官方给的就是这样的:

unity设置为静态的 unity勾选静态_unity_20

 ②难道是不能覆写Unity自带方法,那就随便再Moves.cs里写个空方法,来覆写它。

我去,还是不行。哈哈哈。

③难道是Xlua自带的示例hotfix配置脚本影响了,删除掉它,再试试。

我去,还是不行。哈哈哈。

④难道我的这个项目已经不干净了,有什么影响了它,那就重新创建个测试项目,再试试。

我去,还是不行。哈哈哈。

⑤难道是unity版本不行,我的是比较新的2021版本,那就换个2018版本,再试试。

我去,还是不行。哈哈哈。


我累了,需要歇歇,看你们的了,如果你们是成功的,记得告诉我一声 ,让我知道我死在哪了。哈哈哈。


我去,经过我反复琢磨,我终s于又复活了。真坑,腾讯官方提供的Xlua文件有问题,使用了之前版本的文件就可以正常进行静态打标签Hotfix了。下面附上我的项目小Demo:

GitHub - Flaridoo/Xlua-tiny-Demo: Try Tencent Xlua in Unity Project

是TM真坑!哈哈哈。