前往
大廳
主題

【遊戲開發日誌 #16.1】序列化特定變數型別所導致的執行檔崩潰

サンエックス | 2022-09-02 16:34:16 | 巴幣 2006 | 人氣 296

如題,是在這幾天要匯出執行檔所發現的:

於編輯器內測試期間,遊戲一切運行狀況良好,編譯也沒有顯示任何錯誤。
然而此次匯出後要執行遊戲時,Unity 就給我糊了個崩潰畫面到臉上,連 Logo 顯示畫面都沒進入。

距離上次匯出測試應該有半年以上了,先前的執行檔也都很正常。
這種上來就顯示個驚嘆號,隨後就自動關閉的場合,我整個也是很

隨後去 google,查不出個有解策的類似案例,去翻找系統生成的 log 紀錄檔也沒有與崩潰原因關聯的資訊。


無奈之下,只得以回溯專案的先前版本,從上次成功匯出執行到這次崩潰發生的範圍中找起。
還因為崩潰僅會發生在匯出的執行檔上,處理過程中,這邊也只能做細部調整,然後一次又一次去匯出執行測試,直到發現觸發崩潰的原因為止。

崩潰的發生時機和緣由相當不明確,前後至少匯出測試了有上百次
Δ 截了一堆交叉比對還有匯出結果的圖

最後終於是找到了,這邊把會發生崩潰場合的代碼簡化如下:

∎ 於場景中建立附有圖例 SerializeErrorObject 的物件,亦或是弄成 Prefab 讓其他物件來"載入"該元件。
SerializeErrorObject 包含至少兩個特定的序列化變數:
● 類型為 SerializeErrorClass 的欄位。
● 一組集合類型的欄位,元素類型不拘,陣列或清單兩者已測試過皆可。
∎ 可序列化類別 SerializeErrorClass 繼承泛型類別 SerializeErrorGeneric<T>,泛型型別不拘。
∎ 可序列化泛型類別 SerializeErrorGeneric<T> 中,包含一個序列化變量,同樣型別不拘。
此外,該變量以條件編譯 #if UNITY_EDITOR 包覆,即該變量只會在 Unity 編輯器中進行編譯,而非匯出的執行檔。

上面是觸發這次崩潰的最低條件,對條件一些做變化這邊也測試過了,像是把:
SerializeErrorObject 中的集合欄位的型別改成 floatenumVector2 等…
SerializeError1 欄位的型別直接改用成 SerializeErrorGeneric<T>
SerializeErrorGeneric<T> 移除泛型
∎ EditorOnlySerialization 加上 [NonSerialized] 屬性
∎ Player Settings 中 Configuration 區塊進行調整,例如把 Api Compatibility Level 設為任何樣式

之類的,都不會發生這次的崩潰情形。


可能是觸發條件太過於特定了,翻來翻去也找不到同樣的案例。
順帶一提,這種情形只發生在我 Unity 版本為 2019.4.25f1 的專案上,改用電腦裡舊版 2018.2.8f1 的專案來測試則不會產生崩潰,兩者皆是開啟新專案並匯出執行檔來進行測試的。

只好理解成是 Unity 本身序列化的漏洞,往後的版本是否會發生同樣狀況就不得而知了,這邊僅做為個人遊戲開發日誌的分享。


同步發表於 專板

創作回應

追蹤 創作集

作者相關創作

更多創作