2015年5月7日 星期四

Scriptable Object BUG處理心得

Cleaning up leaked objects in scene since no game object, component or manager is referencing them

如果您不是Unity編輯器Plugin的開發者, 請忽略這個訊息
這個錯誤不會對您的遊戲程式造成傷害或負擔
同時可以跳過本文, 不用繼續閱讀

如果你的Unity開始不斷發出這樣的哀嚎, 且您是編輯器Plugin開發者
那麼您就會需要閱讀本文
0. 這個Bug是我造成的嗎?
這個訊息完整版本應該會類似這樣

Cleaning up leaked objects in scene since no game object, component or manager is referencing them XXXXXX has been leaked N times.

其中請看看XXXXXX的名稱是否是您所開發的類別
如果不是, 問題應該就不在您身上, 請找XXXXXX類別的開發者處理
如果他不知道怎樣處理, 請他來閱讀本文

N是代表他的Code一共犯了幾次這樣的錯誤

1. 這個Bug好像是我造成的, 但理由到底是什麼?
理由簡短的解釋就是:
你在某個地方create了ScriptableObject的物件
但你沒有正確處理他, 接著Unity幫你進行了自動處理, 並且善意的印出訊息
告訴你你的程式有這樣的問題, 雖然無傷大雅, 但他還是會持續告訴你

2. 能簡單告訴我怎樣重現這樣的Bug嗎?
現在假設你有一個繼承自ScriptableObject, AAA

接著在編輯器程式中, 找個會被執行到的地方寫下類似這樣的code
ScriptableObject.CreateInstance<AAA>();
請仔細檢查您所開發的XXXXXX類別內容
應該可以找到類似的程式碼

接下來去編譯編輯器code, 這個bug應該就會出現了

3. 所以我應該怎樣修正這個問題?
把ScriptableObject.CreateInstance<AAA>();產生的物件接起來
AAA so ScriptableObject.CreateInstance<AAA>();
用完後
Object.DestroyImmediate(so);

這樣就可以修好了

補充:
因為這是編輯器內部的一個比較奇怪不算錯誤的錯誤
所以在修正code後, 請重新啟動Unity, 否則先前的訊息應該還是會持續刷出來

本文參考了這篇文章的第二段說明

Finding the cause

這段文章裏頭找到的解決方法

沒有留言:

張貼留言