zoukankan      html  css  js  c++  java
  • Unity插件开发:PrefabUtility(二)--Prefab实例批量Apply

            在《Unity插件开发:PrefabUtility--Prefab实例引用断开和替换》中我们使用了PrefabUtility实现了Prefab实例的引用断开和替换功能,现在我们继续使用PrefabUtility来实现场景中所有Prefab实例的Apply功能。

    需求描述

            在很多情况下,我们会在场景中修改Prefab实例,这些修改理应apply到Prefab上,但是有时候会忘记Apply,事后再去找,可能花费很多时间。或者在一些条件下,需要对场景中的一些Prefab实例进行批量修改。这时候也需要批量apply到Prefab上。

    思路

            遍历场景中所有GameObject,如果是Prefab实例,找到这个Prefab实例的Prefab根节点(可能重复,所以这里还需要过滤一下,避免重复处理),然后找到这个Prefab实例对应的Prefab,用场景中的这个物体制作一个Prefab替换掉原来的Prefab。

            image

            注意,上图中Directional Light是场景中的根节点,而Ticket是Prefab根节点。

            要完成这个功能,需要用到以下几个函数:

    • PrefabUtility.ReplacePrefab——替换Prefab
    • PrefabUtility.GetPrefabParent——获取prefab
    • PrefabUtility.GetPrefabType——获取一个物体的prefab类型
    • PrefabUtility.FindPrefabRoot——获取一个物体在prefab(或prefab实例)中的根节点

    实现

        [MenuItem("Tools/Prefab/ApplyAll")]
        public static void AllApply()
        {
            var prefabs = Object.FindObjectsOfType<GameObject>();//场景中所有GameObject
            var lst = new List<GameObject>();//用于避免重复的列表
            foreach (var gameObject in prefabs)//遍历
            {
                var isprefab = PrefabUtility.GetPrefabType(gameObject);//物体的PrefabType
                if (isprefab != PrefabType.PrefabInstance)//不是Prefab实例
                    continue;
    
                var prefab = PrefabUtility.GetPrefabParent(gameObject);//没有对应的Prefab(可能被删除掉了)
                if (prefab == null)
                    continue;
                //Debug.Log(prefab);
    
                var rt = PrefabUtility.FindPrefabRoot(gameObject);//物体的Prefab根节点
                if (rt == null || lst.Contains(rt))//存在且不重复
                    continue;
                lst.Add(rt);//增加到列表中
                //Debug.Log(rt.name);
                PrefabUtility.ReplacePrefab(rt, prefab);//实现替换达到Apply的目的
            }
        }

    以上还可以增加一些过滤,比如没有修改过的物体不需要做替换等等

    操作

           直接在工具栏,Tools->Prefab->ApplyAll即可。

    转载保留:http://www.cnblogs.com/CodeGize http://www.codegize.com

    个人博客请访问:http://www.cnblogs.com/CodeGize/
  • 相关阅读:
    TensorFlow 一步一步实现卷积神经网络
    TensorFlow 卷积神经网络手写数字识别数据集介绍
    深度学习之激活函数
    使用Keras进行深度学习:(二)CNN讲解及实践
    计算智能(CI)之粒子群优化算法(PSO)(一)
    C# SqlBulkCopy
    Oracle 连接数据库
    C# DataTable转换为Html 用Html的方式预览DataTable的数据
    C# 中文判断
    C# Excel To DataTable
  • 原文地址:https://www.cnblogs.com/CodeGize/p/9115296.html
Copyright © 2011-2022 走看看