很迷的Unity小問題

2021-09-12 00:13:01 字數 1223 閱讀 8409

ps: 2020-4-29 現在版本的unity已經不會出現這種情況了

pss: 2020-9-8 其實還是有的,這是使用event造成的記憶體洩漏,現在難以避免,只能小心為上。不過好在unity封裝了乙個unityevent,將event的管理權交付給了unity系統,所以在destroy物件後,監聽也會一併被解除,就是不知道效能如何。

psss:效能不咋地,需要在效能與易用度之間進行取捨

最近在寫指令碼的時候出了個挺詭異的bug。

有gameobj1和gameobj2

obj1上掛載的指令碼監聽了obj2上的指令碼裡的事件。

而obj1上用於響應事件的函式裡使用了自身的gameobject屬性。

接著我需要把obj1銷毀。

在obj1被銷毀後,obj2觸發了事件,這時log視窗瘋狂地報錯,提示gameobject已被銷毀。

懵逼了很久,之後花了大量的時間來找問題的根源。

功夫不負有心人,在我吱吱不倦地搜尋下,終於找到了這個詭異的萬惡之源。

因為在我之前的嘗試中,我認為,當gameobject被銷毀後,其身上掛載地指令碼也會被gc收走,監聽的函式不再呼叫。

但這時我發現之前似乎都是巧合,可能是由於某些邏輯原因造成了我對於機制的誤判。

當gameobject被銷毀後,指令碼若是在監聽某些事件,是不會被gc收走的。

這就可以解釋之前出現的情況。

我的監聽函式裡有呼叫gameobject的語句,當gameobject已經被destroy了,指令碼仍然在監聽,此時obj2觸發了事件,失去了gameobject的監聽指令碼自然會報gameobject已被銷毀之類的錯誤。

那麼要解決這個問題的話,我就得在物件銷毀時解除所有事件的監聽。

這顯然太麻煩了,有一萬種原因會讓我忘記這個操作,引起的bug也並不是那麼好找。

目前還沒有更好的方法來替代它。

Unity之掛載小問題

在使用unity開發遊戲的過程中,我們會遇到很多預製體,動畫,ui精靈,特效要掛載,不過這樣子直接掛載相信大家在打包或者在其他版本的unity上執行會出現丟失的情況。如果不想直接掛載的話可以在 裡面載入。unity提供了乙個resources資料夾可以供我們在 載入檔案。子彈定義 private g...

遇到的小問題

今天用vs2005編譯乙個專案的時候出現下面2個錯誤 dibimage.obj error lnk2019 無法解析的外部符號 cuda,該符號在函式 public bool thiscall cdibimage medianfilter char long,long,int,int,int,int...

MS SQL的小問題

其實我們建立了同樣名稱的資料庫登入使用者後,資料庫中的表我們照樣不能使用時因為sid的不同,就是系統登入表和資料庫使用者表中的使用者名稱相同,單是sid欄位,資料庫中的還是以前舊系統的sid值,所以我們就要把它對應成我們新建的,資料庫靠sid來識別使用者。這裡可以使用儲存過程sp change us...