Уничтожение загруженных активов из Unity Asset Bundle

У меня есть загрузка пакета ресурсов в моем проекте, и я добавляю их все в список, чтобы я мог перебирать каждый отдельный объект внутри пакета ресурсов. Однако у меня возникают проблемы с удалением загруженного объекта, когда он мне больше не нужен в моей сцене.

В своих исследованиях я знаю 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 был уничтожен, но вы все еще пытаетесь получить к нему доступ. Ваш сценарий должен либо проверять, является ли он нулевым, либо вы не должны уничтожать объект.

Однако из моего списка ничего не удаляется, и остается первый созданный объект.

Кто нибудь сталкивался с подобной проблемой? Возможно ли то, что я пытаюсь сделать?

Любая помощь будет оценена.


person N0xus    schedule 07.01.2014    source источник


Ответы (1)


Ошибка, которую вы делаете, заключается в том, что вы пытаетесь уничтожить актив, а не игровой объект gameObject. Когда вы вызываете 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 ++;
}
person Steven Mills    schedule 08.01.2014