Unity中删除预制体的子物体

这篇具有很好参考价值的文章主要介绍了Unity中删除预制体的子物体。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

//删除预制体中的某个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;
}

到了这里,关于Unity中删除预制体的子物体的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity中获取一个物体下所有的子物体的方法

    方法1(获取全部子物体,无论子物体SetActive是否为true): 获取全部子物体后,可通过list列表对物体进行批处理; 如添加或移除其子物体的组件,判断其子物体是否有某个组件等等。 方法二(推荐): 该方法为Unity内置的API,会查找物体下对应类型的全部组件; ( 注意:

    2024年02月13日
    浏览(45)
  • 【Unity 3D】游戏对象、添加删除获取组件、预制体Prefabs简介

    觉得有帮助请点赞关注收藏~~~ 创建3D对象 选择GameObject -3D Object命令 选择要创建的3D对象 下面是各个对象的意思 cube 立方体 sphere 圆柱体 capsule 平面 cylinder 胶囊体 plane 球体 quad 面片  可以为上面创建的对象添加刚体组件 选中该对象 在Inspector视图中,单机add component按钮, 选在

    2024年02月04日
    浏览(43)
  • 详解Unity中的预制体

    在Unity中,预制体的作用是重复利用资源,比如游戏世界的花草树木、房屋建筑。这些资源都是重复出现的,我们可以将它做成预制体,方便重复利用。预制体也分原始预制体和变体,本篇我们就来说说它们的区别。 前排提醒:本文仅代表个人观点,以供交流学习,若有不同

    2024年01月17日
    浏览(42)
  • unity——删除父物体下面的所有子物体

    1、直接使用for循环,遍历子物体,使用依次Destory直接销毁子物体; Destroy(parent.GetChild(i).gameObject); 2、注意事项: 1、不要使用Foreach遍历来增删元素,在遍历对象不是值类型时,修改集合元素,也不要使用foreach遍历修改。容易导致赋值错误。 foreach是封装的⼀个迭代器,调⽤

    2024年02月11日
    浏览(73)
  • 用python实现删除照片中的物体

    要使用Python删除照片中的物体,你可以使用图像处理库,如OpenCV和PIL(Python Imaging Library)。以下是一个简单的示例,演示如何使用OpenCV和PIL删除照片中的特定物体。 首先,确保你已经安装了OpenCV和PIL库。你可以使用以下命令在终端或命令提示符中安装它们: shell 复制代码

    2024年01月20日
    浏览(31)
  • Unity中的物体移动

    局部坐标系(Transform.localPosition)是指当前物体相对于父物体的位置,会受到父物体的影响。 世界坐标系(Transform.Position)是指当前物体在世界空间坐标系中的位置,不受父物体影响。 若该物体有父类,则二者的关系为:该物体的世界坐标=该物体父类的世界坐标+该物体的局

    2024年02月03日
    浏览(55)
  • Unity切割图片:把一张图片中的物体裁成多个单独的游戏物体

    首先选中需要切割的图片素材,将Inspector面板中的 Sprite Mode 由默认的 Single改为Multiple ; 然后点击 Sprite Editor ; 第一步之后便会弹出下例面板,然后 点击Slice菜单 ,继续点击,便 会自动被分割好 ,最后 点击右上角的Apply 。 点击Apply后在右下角会弹出一个小的面板,你可以

    2024年02月05日
    浏览(40)
  • unity,如何让当前物体获取鼠标位置,转向鼠标在屏幕中的位置?

    unity,如何让当前物体获取鼠标位置,转向鼠标在屏幕中的位置?

    2024年02月12日
    浏览(50)
  • Unity如何修改预制体(预制件)?

    【预制件】 预制件作用:方便复用 【预制件】的制作 直接拖拽,从层级面板 - 项目面板。层级面板中当前图标会变蓝,子物体名字变蓝色。预制件是一个文件,可以导出,也方便别人使用。 【预制件】修改 直接修改预制件的属性会影响hierarchy中的游戏对象 直接修改hierar

    2024年04月09日
    浏览(37)
  • 详解Unity预制体和预制体变体(Prefab Variant)

    一、预制体变体的创建 二、预制体与变体的绑定 三、预制体到变体的继承关系 四、变体常见API 五、变体用途 通过一个预制体创建预制体变体可以通过以下两种方法: 1.在需要创建变体的预制体上右键选择图中选项即可在预制体当前目录下创建预制体变体。  2.通过脚本进行

    2024年01月17日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包