1

Unity3D の C# スクリプト環境 (Mono で実行) は、オブジェクトを破棄するときに優れた動作をします。破棄されたオブジェクトを指すすべての参照は、自動的に 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

これを達成する方法についてのアイデアはありますか?

ありがとう

4

6 に答える 6

3

等値演算子がオーバーライドされた可能性がありますか? それはあなたのコメントを説明します:「ref1 と ref2 が GameObject ではなく、代わりに System.Object である場合、それは機能しないことを確認してください。」

于 2010-01-24T21:49:33.380 に答える
2

Unity3D (ab) が演算子のオーバーロード + のようなある種の内部フラグを使用する可能性があるため、関数でが設定されbool isDeleted;ている場合は、 yieldsに対する等価テストが実行されます。isDeletedtrueDestroyImmediatenulltrue

于 2010-01-24T21:55:10.147 に答える
1

値パラメーターによる呼び出しを使用して C# でこれを行うことはできません。呼び出しサイトでもキーワードrefを必要とするパラメーターを使用する必要があります。ref

実際、.NET には、到達可能だが破棄された (つまり、割り当てが解除された) 管理対象オブジェクトの有用な概念はWeakReferenceありません (実際にはカウントされないものは無視します)。オブジェクトに到達できないか、破棄できません。

于 2010-01-24T21:39:19.703 に答える
0

これは、「通常の」.NET では不可能です。CLR の動作方法に問題があるだけです。

于 2010-01-24T21:40:10.590 に答える
0

興味深い学術的課題ですが、技術的な観点から追求する価値はありません。あなたはこれを間違った角度から見ています.CLRはオブジェクトの有効期間を管理します. すべての「変数」を null に設定できる唯一の方法は、「ref」パラメーター修飾子を使用してすべての変数を destroy メソッドに渡した場合です。プログラム全体を 1 つのメソッド内に記述する予定がない限り、間違ったツリーを作成していることになります。適切に構造化されたクラスとメソッドは、スコープ外に出る変数が「無効化」され、ガベージ コレクションの対象オブジェクトを解放することを保証します。

于 2010-01-24T21:43:27.713 に答える
0

実際のクラスへの参照を保持する中間クラス (プロキシ) を追加できます。

すべての参照は、この新しい GameObjectProxy になります。これにより、GameObject と同じ API が提供され、それに対するすべての呼び出しが基礎となる GameObject オブジェクトに転送されます。

GameObjectProxy は追加のメソッドも提供します - 基本となる GameObject を破棄し、GameObject が null かどうかを問い合わせます。(そして、本当に悪になりたい場合は、これらを operator= および operator== に組み込むことができます)

GameObject へのすべての呼び出しをプロキシ経由でリダイレクトする必要があるため、この方法ではパフォーマンスが低下する可能性があることに注意してください。また、これはやや悪いことでもあります。参照が「正常に」動作することを期待しているプログラマーを混乱させることになります。

于 2010-01-24T22:03:01.850 に答える