c# - 如何循环并销毁Unity中游戏对象的所有 child ?

标签 c# unity3d

我有以下脚本,它附加到游戏对象并在我单击编辑器中的按钮时运行:

public void ClearChildren() {
    Debug.Log(transform.childCount);
    float i = 0;
    foreach (Transform child in transform) {
        i += 1;
        DestroyImmediate(child.gameObject);
    }
    Debug.Log(transform.childCount);
}

它表明原始 childCount 是 13,最终值为 6。此外,如果我在每次迭代中打印出所有 i,我会看到值 0-6,表明循环只运行了 7 次,而不是预期的 13 次。

我怎样才能删除所有 child ,使最终值为 0?作为引用,我试图删除的 child 是由供应商脚本自动创建的。我还在 [ExecuteInEditMode] 中运行此脚本,以了解它的值(value)。

以下脚本具有相同的行为;如果 childCount 从 4 开始,那么它在 2 结束:

public void ClearChildren() {
    Debug.Log(transform.childCount);
    for (int i = 0; i < transform.childCount; i++) {
        Transform child = transform.GetChild(i);
        DestroyImmediate(child.gameObject);
    }
    Debug.Log(transform.childCount);
} 

如果我尝试以下操作,我会收到一个指向 foreach 行的运行时错误,上面写着“InvalidCastException:无法从源类型转换为目标类型。”

public void ClearChildren() {
    Debug.Log(transform.childCount);
    foreach ( GameObject child in transform) {
        DestroyImmediate(child);
    }
    Debug.Log(transform.childCount);
}

最佳答案

此处的其他解决方案似乎设计过度。我想要代码占用空间更小的东西。这会破坏对象的直接子对象及其所有后代。

while (transform.childCount > 0) {
    DestroyImmediate(transform.GetChild(0).gameObject);
}

关于c# - 如何循环并销毁Unity中游戏对象的所有 child ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46358717/

相关文章:

c# - .NET WinForms 控件类

c# - 如何快速检查警报是否存在?

unity3d - 在运行时导入 FBX

ios - 在 Xcode 7 中从 Unity 构建 iOS 时出错

c# - 更改访问修饰符

c# - 如何在 Unity 中高效地对大量 RGB 颜色进行排序

C#:Unity Photon 不向第二个连接添加物理

c# - 从 C++ 到 C# 重写串口通信

c# - Linq to Sql 联合语句

c# - 如何使用 Windows 10 创建特定于设备系列的项目,例如在 W8.1/WP8.1 上?