我的项目中有一个资产包加载,我将它们全部添加到列表中,以便我可以遍历资产包中的每个单独对象。但是,当我在场景中不再需要它时,我无法删除已加载的对象。
在我的研究中,我知道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或者您不应该销毁该对象。
但是,没有任何内容从我的列表中删除,并且仍然会生成第一个要生成的对象。
有没有人遇到过类似的问题?我正在努力做甚么可能吗?
任何帮助将不胜感激。
答案 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 ++;
}