RPG: TypeError: Cannot read properties of null (reading 'unvisible AllModel")
首先,這一篇是在講如果你在 Mac 啟動遊戲同時他有使用 live2d 並且使用 enc_lv2d.js 這個 plugin 才會遇到的錯誤
其次,如果啟動遊戲閃退讓你看不到錯誤訊息那這裡會教你一個笨方法...
我們在以前的系列文章中已經提及了各種啟動 RPGMaker 遊戲可能會遇到的問題,包括:
- Steam failed to init
- dev tool pixi.js.map error
- ReferenceError OrangeGreenworks is not defined
- ReferenceError store is not defined
- Failed to execute 'getImageData' on 'CanvasRenderingContext2D': Value is not of type 'long'.
但是,在執行這個遊戲時遇到的第一個問題就是,遊戲閃退,同時如果看 Terminal 只會看到
```
[1021/183056.629776:ERROR:third_party/zlib/google/zip.cc:310] Cannot open '/Applications/nwjs.app/Contents/Resources/app.nw': FILE_ERROR_NOT_FOUND: No such file or directory (2)
[99257:84666949:1021/183058.494903:ERROR:sandbox/mac/system_services.cc:31] SetApplicationIsDaemon: Error Domain=NSOSStatusErrorDomain Code=-50 "paramErr: error in user parameter list" (-50)
```
但其實這些錯誤訊息根本不重要,網路跟 AI 只會說你的 nwjs 損毀之類的。
你如果仔細看,會發現在遊戲閃退之前在介面上有跳出錯誤訊息,一開始嘗試寫一個 plugin 去 hook 他產 log 出來,但是太麻煩了,最後用了一個笨方法解決。
是的,螢幕錄影,搭判 OCR 可以很方便把錯誤訊息複製出來。
這邊可以看到錯誤訊息是:
```
Cannot read properties of null (reading 'unvisible AllModel')
TypeError: Cannot read properties of null (reading 'unvisible AllModel")
SceneManager.changeScene (chrome-
extension://mkjhibbcmkbllnmkpkmcdbldjkcdnmen/www/js/plugins/enc_lv2d.js:184:84580)
SceneManager.updateMain (chrome-
extension://mkjhibbcmkbllnmkpkmcdbldjkcdnmen/www/js/rpg_managers.js:1982:18)
SceneManager.update (chrome-
extension://mkjhibbcmkbllnmkpkmcdbldjkcdnmen/www/js/rpg_managers.js:1907:14)
```
同時上面還有一個遊戲作者的部落格網址,裡面也有提到一些其他人遇到的 enc_lv2d.js 相關的一些錯誤訊息,但是根本篇遇到的不一樣,不過看起來這個 plugin 是蠻不穩定的。
這邊有兩個解法,你可以選擇把 enc_lv2d.js 模組刪掉,並且寫一個 stub 的 plugin 去修正相關調用,遊戲就可以正常執行啦,但是遊戲裡的 Live2D 你就看不到了,只能看 CG,所以為了能正常看到 Live2D 我們進行以下修正。
免責聲明:本文僅針對村人A及 PROGRESS Plus 所開發之外掛在實務使用中可能出現的技術問題進行分析與探討。外掛本身的著作權歸原作者所有,本文僅限於分享學術性與技術性研究內容,不構成任何未經授權的使用、修改或散佈。
首先,你會發現 enc_lv2d.js 是經過混淆的,這時候你需要使用一些現成的工具來輔助,例如:
https://obf-io.deobfuscate.io/
在做任何修改之前記得先備份你的原始檔案避免你改失敗。
接下來,你可以開始修改 Live2D 外掛程式的一些執行錯誤:
- 在 www/js/plugins/enc_lv2d.js:1081 中,將所有檔案路徑處理換成 path.join(...),並在 SceneManager.exit() 之後提前新增了 return;這可以防止 DRM 檢查因 Windows 風格的路徑而失敗。
- 在 www/js/plugins/enc_lv2d.js:1134 中,SceneManager.snapForBackground 和 SceneManager.changeScene 的覆蓋現在會保護每個 unvisibleAllModel 調用,因此它們僅在 $gameLive2d 存在時運行。
留言
張貼留言