You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在脚本中销毁无子物体的GameObject并复制Hierarchy中的物体

Unity脚本实现两个常用功能:销毁无子物体+复制指定物体

一、检测并销毁无子女的GameObject

如果要批量检测场景中某个父物体下的所有子物体(或整个Hierarchy中的物体),判断其是否没有子物体,若满足则销毁该物体,可参考以下代码:

using UnityEngine;

public class CleanEmptyObjects : MonoBehaviour
{
    // 可在Inspector指定要检测的根物体,留空则检测整个场景的所有物体
    public GameObject rootObject;

    void Start()
    {
        GameObject[] targetObjects;
        if (rootObject != null)
        {
            targetObjects = rootObject.GetComponentsInChildren<GameObject>(true);
        }
        else
        {
            targetObjects = FindObjectsOfType<GameObject>(true);
        }

        foreach (var obj in targetObjects)
        {
            // 排除根物体自身,只检测子层级物体
            if (obj.transform.childCount == 0 && obj != rootObject)
            {
                Destroy(obj);
                Debug.Log($"销毁无子女物体:{obj.name}");
            }
        }
    }
}

说明:

  • GetComponentsInChildren(true)会包含物体的所有嵌套子物体,包括非活跃状态的物体
  • Destroy默认帧末执行,若需立即销毁可改用DestroyImmediate,但运行时频繁使用可能影响性能

二、复制指定GameObject创建副本

要在脚本中复制Hierarchy中的指定物体,使用Unity内置的Instantiate方法即可,示例代码如下:

using UnityEngine;

public class DuplicateObject : MonoBehaviour
{
    // 在Inspector中指定要复制的目标物体
    public GameObject targetObject;
    // 可选:指定副本的父物体,留空则副本位于Hierarchy根节点
    public Transform parentTransform;

    void Start()
    {
        if (targetObject == null)
        {
            Debug.LogError("请先指定要复制的目标物体!");
            return;
        }

        // 创建副本,继承原物体的位置、旋转和父层级
        GameObject duplicate = Instantiate(targetObject, parentTransform);
        // 给副本重命名,避免与原物体重名
        duplicate.name = $"{targetObject.name}_Copy";
        Debug.Log($"已创建副本:{duplicate.name}");
    }

    // 可作为触发方法(比如绑定UI按钮)
    public void TriggerDuplicate()
    {
        if (targetObject == null) return;
        GameObject duplicate = Instantiate(targetObject, targetObject.transform.parent);
        duplicate.name = $"{targetObject.name}_Copy_{Random.Range(100, 999)}";
    }
}

说明:

  • Instantiate会完整复制原物体的组件、子物体和当前状态
  • 若需自定义副本的位置和旋转,可传入额外参数:Instantiate(targetObject, newPos, newRot, parentTransform)

内容的提问来源于stack exchange,提问作者Gryffox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:40:54