GameFramework、xlua、hybrid
发布时间:2023-01-22 10:07:53 来源:哔哩哔哩

报错

[2023-01-22 09:40:00.322][Exception] ExecutionEngineException: Method body is null. XLua.LuaDLL.Lua::xlua_get_lib_version


(资料图片)

XLua.LuaEnv..ctor () (at <00000000000000000000000000000000>:0)

ProjectA.XLuaComponent.Init () (at <00000000000000000000000000000000>:0)

这个报错不知道为什么,最开始把LuaEnv初始化卸载XLuaComponent的时候,没有提示报错。

产生这个报错的原因就是这个函数是反射dll中的函数。在AOT剪裁时,给搞掉了。也有可能是反射的地方不对。本想看看这个DllInport是怎么反射的,最后还是无奈放弃,rider编译不出dll,看不见iL。看了别人的xlua接入,采用的方案就是把luaDll部分转移到AOT中。最后我也采用了这个方案,最后成功运行。

讲一讲思路,

assembly分包,一种是unity-csharp作为AOT,另一种就是作为hotfix。我采用的是后者,所以我需要做一个资源更新的启动件。

我单独做了一个Launch的scene,这个scene负责更新资源,资源更新完毕后,先加载dll,再切换到我的Game的Scene,相关脚本单独放一个文件夹,namespace也要和主工程区分,作为aot assembly。game scene负责实际的预加载和游戏启动。

切换场景的时候也有坑,你需要通过Gameframework的scene启动scene,这意味着你要找到Gameframework使用SceneManager切换scene的地方,因为Gameframework使用的是addtive模式,我们要使用single模式,切换scene前,记得要把Gameframework重启一次,clear一下里面的缓存。不然在game scene中使用Gameframework就会报错。

要么就用一套Gameframework来做。但是我个人更喜欢这种方案,因为我可以做到整个场景都热更,不需要去关心launch的部分。