Unity中删除预制体的子物体

Unity中要删除预制体中的某个子游戏物体,需要先将该预制体UnPack,然后调用DestroyImmediate删除GameObeject,然后再保存预制体。这其实挺麻烦的,因为有时你拿到的gameObject是Asset中的资源,将预制体实例化后不好找到实例中对应的gameObject,拿名字找可以,但还是会有重名的风险。
我的方法无论传入的gameObject是处于场景中的实例还是处于Asset中都可以删除:

//删除预制体中的某个GameObject,不论其是不是在场景中的instance
    public static void DestroyGameObjectInPrefab(GameObject go)
    {
        if (PrefabUtility.IsPartOfAnyPrefab(go))
        {
            GameObject instance = null;
            GameObject deleteObj = null;
            bool isInAsset = EditorUtility.IsPersistent(go);
            if (isInAsset)
            {
                //在asset中
                var root = go.transform.root.gameObject;
                instance = PrefabUtility.InstantiatePrefab(root) as GameObject;
                deleteObj = GetCorrespondingGameObjectInInstance(instance.transform, go);
            }
            else
            {
                instance = PrefabUtility.GetOutermostPrefabInstanceRoot(go);
                deleteObj = go;
            }
            string prefabPath = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(instance);
            PrefabUtility.UnpackPrefabInstance(instance, PrefabUnpackMode.Completely, InteractionMode.AutomatedAction);
            GameObject.DestroyImmediate(deleteObj);
            PrefabUtility.SaveAsPrefabAsset(instance, prefabPath);
            if(isInAsset)
                GameObject.DestroyImmediate(instance);
        }
    }

    public static GameObject GetCorrespondingGameObjectInInstance(Transform root, GameObject assetObj)
    {
        if (PrefabUtility.GetCorrespondingObjectFromOriginalSource(root.gameObject) == assetObj)
        {
            return root.gameObject;
        }
        foreach (Transform child in root)
        {
            var ret = GetCorrespondingGameObjectInInstance(child, assetObj);
            if (ret != null)
                return ret;
        }
        return null;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值