欢迎光临散文网 会员登陆 & 注册

GameFramework、xlua、hybrid

2023-01-22 10:09 作者:伪乱  | 我要投稿

报错

[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中。最后我也采用了这个方案,最后成功运行。

如果看见了上面那个报错,可以参考dalo开源出来的解决办法。着重看xlua文件夹下的LuaDLL.cs。aot和hotfix都需要看。这个问题很简单的就规避掉了。

https://toscode.gitee.com/ldr123/HybridCLRXlua


讲一讲思路,

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的部分。

GameFramework、xlua、hybrid的评论 (共 条)

分享到微博请遵守国家法律