2010-01-24 15 views
1

Unity3D中的C#腳本環境(在Mono下運行)在銷燬對象時具有很好的行爲。所有指向該銷燬的對象引用獲得全自動空:C#自動引用分配 - 正在引用null

GameObject ref1 = (GameObject)Instantiate(obj); 
    GameObject ref2 = ref1; 

    if (ref1 != null) 
     Debug.Log("ref1 is not null"); 

    DestroyImmediate(ref1); 

    if (ref1 == null) 
     Debug.Log("ref1 is null"); 

    if (ref2 == null) 
     Debug.Log("ref2 is null");  

輸出:

ref1 is not null 
    ref1 is null 
    ref2 is null 

如何達致這任何想法?

感謝

+0

只要找出如果ref1和ref2不是一個遊戲對象,而是一個System.Object,那麼它不會工作。 – noon 2010-01-24 21:42:20

回答

2

可能的是,Unity3D(AB)使用操作符重載+某些一種內部標記的像bool isDeleted;使得當isDeletedDestroyImmediate功能被設置爲true然後針對null平等測試產生true

+0

我也這麼認爲。 謝謝 – noon 2010-01-24 21:57:20

+0

順便說一下,你爲什麼說「收益」而不僅僅是「回報」? – noon 2010-01-24 22:00:18

+0

他並不是指'yield'關鍵字,但它正確地使用了這個詞:) – 2010-01-25 07:31:19

1

你不能按值參數調用爲此在C#。您必須使用ref參數,這些參數在呼叫站點也需要ref關鍵字。 (事實上​​,在.NET中沒有有用的概念可用但被摧毀(即釋放)的管理對象(當然,忽略WeakReference這實際上並不算數)。該對象無法到達或無法銷燬。

+0

,他必須將所有引用該對象的變量傳遞給他的Destroy方法......而且, – x0n 2010-01-24 21:40:42

0

這在「常規」.NET中是不可能的,這不僅僅是CLR的工作原理。

+0

Unity仍然是C#,它們在Mono上運行。你認爲他們爲了達到目的而改變了一些單聲道行爲嗎? – noon 2010-01-24 21:45:13

+0

雖然unity3d基於單聲道,但我相當肯定,他們對其進行了大幅修改。畢竟unity3d在單觸之前就支持iPhone了。 – 2010-01-25 07:32:36

0

雖然這是一個有趣的學術挑戰,但從技術的角度來看,這並不值得追求。你從錯誤的角度看待這個問題 - CLR爲你管理對象的生命週期。將所有「變量」設置爲null的唯一方法是,如果您使用「ref」參數修飾符將所有變量傳遞給了destroy方法。除非你打算用一種方法編寫你的整個程序,否則你會吠叫錯誤的樹。適當結構化的類和方法將確保超出範圍的變量被「清空」,釋放垃圾收集的目標對象。

+0

我理解你的觀點,但我的目標不是爭辯這是否是一個好的設計。我只是詛咒他們是如何做到的。 – noon 2010-01-24 21:51:01

+0

好吧,我想我誤解了unity3d - 我以爲這是一種看起來像c#的腳本語言,但我現在看到它是_is_ c#。我和你一樣感興趣:) – x0n 2010-01-24 22:57:31

3

也許平等運算符已被覆蓋?這會解釋你的評論:「只要發現如果ref1和ref2不是一個GameObject而是一個System.Object,那麼它就無法工作。」

+0

這是否意味着他們在調用DestroyImmediate時將「Destroyed」標誌設置爲true。那麼在==運算符中,他們會在比較null時檢查這個標誌嗎? – noon 2010-01-24 21:56:23

0

您可以添加一箇中介類(代理),該類包含對實際類的引用。

你所有的裁判都會對這個新的GameObjectProxy。這將提供與GameObject相同的API,並將其上的任何調用轉發給底層的GameObject對象。

GameObjectProxy還會提供額外的方法 - 銷燬底層GameObject,並查詢GameObject是否爲空。 (如果你想成爲真正的邪惡者,這些可能會被內置到operator =和operator ==中)

請記住,這種方法可能會降低性能,因爲每次調用GameObject都必須通過代理重定向。這也有點邪惡 - 它會混淆程序員,他們期望他們的引用表現「正常」。