Unity Editor 检查工程Prefab(预设)中的空组件

在我们做项目的过程中 经常会有预设中出现空的脚本

例如:

导致的原因是因为 脚本的丢失

现在我们来做一个检查工程中有空脚本的预设工具

老规矩直接上代码 放到工程就能用

using UnityEngine;
using UnityEditor;
using System.IO;
using System.Collections.Generic;

public class PrefabTool : EditorWindow
{
    [MenuItem("Prefab Tool/Check Missing Scripts")]
    static void CheckMissingScripts()
    {
        List<string> listString = new List<string>();

        CollectFiles(Application.dataPath, listString);

        for (int i = 0; i < listString.Count; i++)
        {
            string Path = listString[i];

            float progressBar = (float)i / listString.Count;

            EditorUtility.DisplayProgressBar("Check Missing Scripts", "The progress of : " + ((int)(progressBar * 100)).ToString() + "%", progressBar);

            if (!Path.EndsWith(".prefab"))//只处理prefab文件
            {
                continue;
            }

            Path = ChangeFilePath(Path);

            AssetImporter tmpAssetImport = AssetImporter.GetAtPath(Path);

            GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(tmpAssetImport.assetPath);

            if (prefab == null)
            {
                Debug.LogError("空的预设 : " + tmpAssetImport.assetPath);

                continue;
            }

            Transform[] transforms = prefab.GetComponentsInChildren<Transform>();
            //获取所有的子节点;

            for (int j = 0; j < transforms.Length; j++)
            {
                GameObject obj = transforms[j].gameObject;

                var components = obj.GetComponents<Component>();
                //获取对象所有的Component组件
                //所有继承MonoBehaviour的脚本都继承Component

                for (int k = 0; k < components.Length; k++)
                {
                    if (components[k] == null)
                    {
                        Debug.LogError("这个预制中有空的脚本 :" + tmpAssetImport.assetPath + " 挂在对象 : " + obj.name + " 上");
                    }
                }
            }
        }
        EditorUtility.ClearProgressBar();
    }

    //改变路径
    //这种格式的路径 "C:/Users/XX/Desktop/aaa/New Unity Project/Assets\a.prefab" 改变成 "Assets/a.prefab"
    static string ChangeFilePath(string path)
    {
        path = path.Replace("\\", "/");
        path = path.Replace(Application.dataPath + "/", "");
        path = "Assets/" + path;

        return path;
    }

    //迭代获取文件路径;
    static void CollectFiles(string directory, List<string> outfiles)
    {
        string[] files = Directory.GetFiles(directory);

        outfiles.AddRange(files);

        string[] childDirectories = Directory.GetDirectories(directory);

        if (childDirectories != null && childDirectories.Length > 0)
        {
            for (int i = 0; i < childDirectories.Length; i++)
            {
                string dir = childDirectories[i];
                if (string.IsNullOrEmpty(dir)) continue;
                CollectFiles(dir, outfiles);
            }
        }
    }
}

参考 Unity3D研究院编辑器之不实例化Prefab获取删除更新组件(十五) | 雨松MOMO程序研究院

链接:http://www.xuanyusong.com/archives/3727

这篇博客里面那个删除空脚本的方法 我测试 发现有问题 并不能用!

时间: 2024-10-10 06:37:29

Unity Editor 检查工程Prefab(预设)中的空组件的相关文章

【Unity】3.2 利用预设(Prefab)制作可复用的组件

分类:Unity.C#.VS2015 创建日期:2016-04-02 一.简介 预制体(Prefab,也叫预设)是"存储在工程视图(Project View)中"的一种特殊的资源,是一种可重复使用的游戏对象(GameObject)的容器. 如果在Project中有多个预制体(Prefab),为了容易查找,可将这些预制体全部保存到Project视图中Assets文件夹的Prefabs子文件夹下. Prefabs子文件夹下的的所有预制体都可以放入到多个场景中,而且即使在同一个场景中仍然可以

Unity学习笔记13——代码动态加载Prefab预设体

在进行一些功能开发的时候,我们常常将一些能够复用的对象制作成.prefab的预设物体,然后将预设体存放到Resources目录之下,使用时再动态加载到场景中并进行实例化.例如:子弹.特效甚至音频等,都能制作成预设体. 一.预设动态加载到场景: 一个预设体要能够通过代码控制在场景中进行显示,需要三个步骤,这里我们以动态加载怪物血条为例子分析一个常见的误区: 1.预设体资源加载: //加载预设体资源 GameObject hp_bar = (GameObject)Resources.Load("Pr

Unity Editor Extensions – Custom Inspectors

?? 转载请注明出处:http://blog.csdn.net/u010019717 更全的内容请看我的游戏蛮牛地址:http://www.unitymanual.com/space-uid-18602.html 这是在"Unity Editor Extension"系列的第 2 次帖子. post描述了为创建自定义inspectors面板在 Unity 编辑器的基本步骤.在该系列的下一个posts,我将深入探讨更高级的主题,例如inspectors及Unity's serializa

【Unity】6.2 在VS2015中调试 C# 脚本

分类:Unity.C#.VS2015 创建日期:2016-04-16 一.简介 这一节先利用GUI显示一个简单的界面(以后还会专门介绍GUI),并解释如何在VS2015中调试C#脚本. 本节例子的运行效果如下: 二.调试C#脚本的方式 有以下方式: (1)利用断点调试.断点设置和取消的办法与在控制台应用程序中利用断点调试C#代码的办法相同. (2)通过Debug类提供的方法在后台输出调试信息.该办法会直接在VS2015输出窗口以及Unity的控制台(Console)中输出调试信息. (3)在Un

[cb]Unity Editor Toolbar 编辑器扩展

1.Apply to Prefab [把改动应用到Prefab] if (GUILayout.Button("Apply Collider To Prefab")) { PrefabUtility.ReplacePrefab(simActor.Preview, PrefabUtility.GetPrefabParent(simActor.Preview), ReplacePrefabOptions.ConnectToPrefab); }     2.Current SceneView

查找界面预设中的中文

需求如上一篇. 预设中很多UILabel,是在编辑器阶段直接赋值,因此需要逐个替换,可以将简体和繁体替换的文字做成字典,简体为key,繁体为value. 对UIlabel中的text进行逐行替换. 需要注意换行符 上代码 [MenuItem("Assets/misc/批量替换text中的中文")] static void 批量替换text中的中文() { Dictionary<string, string> replaceDic = new Dictionary<st

Unity Editor 执行时机的问题

在上上篇博文,我提到了Unity编辑器. 即引用 Unity Editor命名空间,且添加[CustomEditor(typeof(Class))] 就可以定制对应Class的Inspector面板. 但这个类本身,也就是ClassEditor的执行事实上并不需要启动Unity项目 这个并不是什么很难发现的事情,因为编写Editor的过程中,对应类的Inspector面板就会变化 只不过如果这个Editor类存在编译错误的话,就会直接报错,从而项目无法启动 原文地址:https://www.cn

检查处理kettle数据流中的空行

 检查处理kettle数据流中的空行 ETL处理过程中,有时需要生成数据,但是却没有输入数据,这可能有一些问题,所以通常需要ETL数据流产生一个空行数据:有时处理中需要一些聚集功能,则意味着当没有输入数据时,生成值为0:本文说明怎样检测并处理空行数据流. 示例场景 假设有需求需要读取输入数据代表销售(有三个字段:product产品名称.items_sold销售量.turnover销售金额).ETL处理流程需要计算产品的销售总量及销售总额:这里的处理大概是:从输入文件中读取多行数据,然后使用聚

Asp数据库连接出错,请检查Conn.asp文件中的数据库参数设置

Asp数据库连接出错,请检查Conn.asp文件中的数据库参数设置 解决办法: IIS-本地计算机-应用程序池-DefaultAppPool(右键)-高级设置将"启用32位应用程序"设置为true