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”类型的对象已被销毁,但您仍在尝试访问它。您的脚本应该检查它是否为空,或者您不应该销毁该对象。

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

有没有人遇到过类似的问题?我想要做的甚至可能吗?

任何帮助,将不胜感激。

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 回答