unity3d 你如何销毁一个Unity游戏对象并同时从列表中删除?

hec6srdp  于 2022-11-16  发布在  其他
关注(0)|答案(3)|浏览(396)

我有一个游戏对象的列表,它记录了我游戏中的怪物。当怪物被杀死时,它将在列表的位置0。我想摧毁场景中的对象,并将其从列表中删除。
我的问题是,命令是不是:(0)在列表中删除;调用该对象以使其被销毁,还是使其作为某种内存泄漏而存在?
我试过删除怪物,破坏然后删除,保存怪物到var然后删除然后破坏,所有这些都会导致bug。如果我知道命令是如何工作的,我可以缩小问题的范围,或者在我的代码中的其他东西。

lxkprmvk

lxkprmvk1#

如果你将列表设为公共变量,你可以在Unity检查器中看到它。当你摧毁一个怪物时,你会看到列表更改为将怪物设置为空。我会在摧毁之前从列表中移除怪物。你可以在怪物上调用OnDestroy方法,在怪物被摧毁之前从列表中移除怪物。这使用了列表的Remove函数而不是RemoveAt。

fzwojiic

fzwojiic2#

不,从列表中删除它不会破坏它。List.Remove()不会破坏GameObjects -它只是你的个人列表。你需要调用GameObject.Destroy(list[index]);然后您可以列出.RemoveAt(index);然而,如果我们讨论的列表不是GameObjects,而是你自己的普通Class(),那么你就不需要担心内存分配问题,因为有一种叫做垃圾收集的东西,一旦没有人再对一个对象进行活动引用,.NET就会释放该对象的内存。

l7mqbcuq

l7mqbcuq3#

我刚才也有类似的问题。
在列表中存储Unity游戏对象的问题是删除变成了两个部分的问题。首先你需要删除游戏对象,然后是列表项。
如果您尝试在ForEach循环中执行此操作,则会变得很棘手,因为在ForEach循环中删除项会导致问题,因为您正在通过删除其中一个集合来动态更改循环的条件。
我的工作是使用一个for next循环和一个布尔标志来完成这项工作。

do
{
    for (t = 0; t < BossObjects.Count; t++)
    {
        StillWorking = false;
        if (BossObjects[t].FlaggedForDeletion)
        {
            Destroy(BossObjects[t].WholeBossBoxGO);  // Delete the Gameobject
            BossObjects.Remove(BossObjects[t]);      // Delete the List item 
            StillWorking = true;                     // Flag we need another iteration
            break;   // Needed because we changed the list count 
        }
    }
}
while (StillWorking);

相关问题