0

プロジェクトにアセット バンドルをロードしています。アセット バンドル内の個々のオブジェクトを反復処理できるように、それらすべてをリストに追加しています。しかし、ロードしたオブジェクトが不要になったときに、そのオブジェクトを削除するのに苦労しています。

私の研究では、Bundle.UnloadAll を知っていますが、読んだことから、不要なバンドル全体が破棄されます。現在、私のコードは次のようになっています。

if(GUI.Button(new Rect(10,130,100,50), "Forward"))
{
    if( index > 0 && object_List[index] != null)
    {
        Destroy((GameObject)object_List[index]);
    }

    Instantiate((GameObject)object_List[index]);
    index ++;
}

このコードは、読み込まれたアセット バンドル オブジェクトを含むリストを反復処理し、リスト内の次のオブジェクトを生成する必要があります。同時に、以前にロードされたものを破棄する必要があります。しかし、このコードを実行すると、次のエラーが発生します。

データの損失を避けるため、アセットを破棄することは許可されていません。本当にアセットを削除したい場合は、DestroyImmediate (theObject, true); を使用します。

したがって、コードをその提案に変更すると、次のエラーが発生します。

MissingReferenceException: タイプ 'GameObject' のオブジェクトは破棄されましたが、まだアクセスしようとしています。スクリプトで null かどうかを確認するか、オブジェクトを破棄しないようにする必要があります。

ただし、私のリストからは何も削除されず、生成された最初のオブジェクトが残っています。

誰かが同様の問題に遭遇したことがありますか? 私がやろうとしていることは可能ですか?

どんな助けでも大歓迎です。

4

1 に答える 1

0

あなたが犯している間違いは、ゲーム内のゲーム オブジェクトではなく、アセットを破壊しようとしているということです。呼び出すInstantiate((GameObject)object_List[index]);と、ロードされたオブジェクトへの参照が返されます。たとえば、次のようになります。

GameObject myObject = Instantiate((GameObject)object_List[index]);

オブジェクトを提供し、後でそれDestroy(myObject);を破棄するために呼び出す必要があります。

それらを破棄する代わりに、必要に応じてゲームオブジェクトを無効化/有効化してみてください (ただし、なぜそれらを破棄するのかは明確ではないため、これは目的に合わない可能性があります)。

if(GUI.Button(new Rect(10,130,100,50), "Forward"))
{
    if( index > 0 && object_List[index] != null)
    {
        ((GameObject)object_List[index]).SetActive(false);
    }

    ((GameObject)object_List[index]).SetActive(true);
    index ++;
}
于 2014-01-08T07:50:18.100 に答える