销毁Unity Asset Bundle中加载的资源

时间:2014-01-07 17:46:42

标签: c# unity3d assetbundle

我的项目中有一个资产包加载,我将它们全部添加到列表中,以便我可以遍历资产包中的每个单独对象。但是,当我在场景中不再需要它时,我无法删除已加载的对象。

在我的研究中,我知道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或者您不应该销毁该对象。

但是,没有任何内容从我的列表中删除,并且仍然会生成第一个要生成的对象。

有没有人遇到过类似的问题?我正在努力做甚么可能吗?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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 ++;
}