GameFramework、xlua、hybrid
報錯
[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的時候,沒有提示報錯。
產(chǎn)生這個報錯的原因就是這個函數(shù)是反射dll中的函數(shù)。在AOT剪裁時,給搞掉了。也有可能是反射的地方不對。本想看看這個DllInport是怎么反射的,最后還是無奈放棄,rider編譯不出dll,看不見iL??戳藙e人的xlua接入,采用的方案就是把luaDll部分轉(zhuǎn)移到AOT中。最后我也采用了這個方案,最后成功運行。
如果看見了上面那個報錯,可以參考dalo開源出來的解決辦法。著重看xlua文件夾下的LuaDLL.cs。aot和hotfix都需要看。這個問題很簡單的就規(guī)避掉了。
https://toscode.gitee.com/ldr123/HybridCLRXlua
講一講思路,
assembly分包,一種是unity-csharp作為AOT,另一種就是作為hotfix。我采用的是后者,所以我需要做一個資源更新的啟動件。
我單獨做了一個Launch的scene,這個scene負(fù)責(zé)更新資源,資源更新完畢后,先加載dll,再切換到我的Game的Scene,相關(guān)腳本單獨放一個文件夾,namespace也要和主工程區(qū)分,作為aot assembly。game scene負(fù)責(zé)實際的預(yù)加載和游戲啟動。
切換場景的時候也有坑,你需要通過Gameframework的scene啟動scene,這意味著你要找到Gameframework使用SceneManager切換scene的地方,因為Gameframework使用的是addtive模式,我們要使用single模式,切換scene前,記得要把Gameframework重啟一次,clear一下里面的緩存。不然在game scene中使用Gameframework就會報錯。
要么就用一套Gameframework來做。但是我個人更喜歡這種方案,因為我可以做到整個場景都熱更,不需要去關(guān)心launch的部分。