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 = ; i < listString.Count; i++)
{
string Path = listString[i]; float progressBar = (float)i / listString.Count; EditorUtility.DisplayProgressBar("Check Missing Scripts", "The progress of : " + ((int)(progressBar * )).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 = ; j < transforms.Length; j++)
{
GameObject obj = transforms[j].gameObject; var components = obj.GetComponents<Component>();
//获取对象所有的Component组件
//所有继承MonoBehaviour的脚本都继承Component for (int k = ; 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 > )
{
for (int i = ; 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
这篇博客里面那个删除空脚本的方法 我测试 发现有问题 并不能用!
Unity Editor 检查工程Prefab(预设)中的空组件的更多相关文章
- Unity 处理预设中的中文
Unity 处理预设中的中文 需求由来 项目接入越南版本 需要解决的文本问题 获取UI预设Label里面的中文(没被代码控制)提供给越南 Label里面的中文替换成越南文 解决流程 迭代获取Asset ...
- 【Unity】3.2 利用预设(Prefab)制作可复用的组件
分类:Unity.C#.VS2015 创建日期:2016-04-02 一.简介 预制体(Prefab,也叫预设)是"存储在工程视图(Project View)中"的一种特殊的资源, ...
- Unity编程标准导引-2.2Unity中的基本概念
2.2Unity中的基本概念 上述介绍提到了几个概念:游戏对象.场景.资源.相机,这个小节我们来深入了解,同时进行一些实践性操作.不过首先,我们需要大概了解一下Unity的工程文件夹. 2.2.1工程 ...
- 编写 Unity Editor 插件
Editor Style Viewer 在开发过程中,我喜欢编写一些辅助的Editor插件,方便在游戏开发过程进行调试. 下面是摘自Asset Store的一个查看Unity 默认GUI样式的小工具 ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 在脚本中使用MonoBehaviour
继上次分析了热更新的Demo后,这次来介绍如何在热更新代码中使用MonoBehaviour. MonoBehaviour挂载到GameObject对象上的脚本的基类.平常Unity开发时,简单的做法就 ...
- Unity Editor 下创建Lua和Text文件
预览 在Project视图中,扩展右键菜单,右键 – Create - Text File 创建一个Text文件,或者Lua文件. 关键点 获取当前选择的路径,以Assets路径开头 var sele ...
- 【Unity】6.2 在VS2015中调试 C# 脚本
分类:Unity.C#.VS2015 创建日期:2016-04-16 一.简介 这一节先利用GUI显示一个简单的界面(以后还会专门介绍GUI),并解释如何在VS2015中调试C#脚本. 本节例子的运行 ...
- unity接入安卓sdk (unity调用安卓工程)
1.安装jdk 并且配置环境,这个网上资料很多,这里不说了 2.安卓开发软件eclipse集成环境版 下载地址 http://tools.android-studio.org/index.php/ad ...
- unity怎么把工程打包成unitypackage文件
unity怎么把工程打包成unitypackage文件 想探讨问题的原因 上课的时候,看到老师的磁盘都要爆满了,主要的原因是同学们提交的2DGameKit,工程文件太大了. 文件没有压缩,占用空间是2 ...
随机推荐
- JDBC数据库增、删、改、查方法实现类
package daoMYSQL;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedSt ...
- workday3~4
这两天算是把一个模块的功能做完了,功能是数据统计,即按输入的时间统计X小时各个服务器status的数量以及各个服务器的信息,学到了不少东西,为了避免忘记,先记录,有空再整理一下. 1.时间戳的问题 选 ...
- OpenCV 之 图像分割 (一)
1 基于阈值 1.1 基本原理 灰度阈值化,是最简单也是速度最快的一种图像分割方法,广泛应用在硬件图像处理领域 (例如,基于 FPGA 的实时图像处理). 假设输入图像为 f,输出图像为 g,则经 ...
- Perl根据日期分割数据文件
Perl的优势:比C好写,比Shell高效,Linux普遍支持. #!/usr/bin/perl -w # auth: lichmama@cnblogs.com # what: split data_ ...
- Chrome浏览器扩展开发系列之三:Google Chrome浏览器扩展的架构
1) 不可视的background页面 Google Chrome扩展往往包含一个不可见的background页面,Google Chrome扩展的主要业务逻辑都位于此.有两种类型的backgroun ...
- 总结两种动态代理jdk代理和cglib代理
动态代理 上篇文章讲了什么是代理模式,为什么用代理模式,从静态代理过渡到动态代理. 这里再简单总结一下 什么是代理模式,给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原 ...
- JavaScript 的 作用域
在看了几本书之后的一些理解和自己的想法. 作用域,变量的作用范围 在ES6之前 变量的声明 只有var可以声明变量属于某个作用域,并且,也只有全局作用域和函数作用域. (没有var声明的变 ...
- ThinkPhp框架:分页查询和补充框架知识
上一篇的随笔写的是基本操作,现在可以做一些高级操作,例如有条件的查询数据,有分页的条件查询数据 一.一个条件的查询数据 查询数据自然是先要显示出数据,然后根据条件进行查询数据 (1)显示出表的数据 这 ...
- Async(异步)(一)
在谈到异步的概念时,先要了解几个概念了. 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源. 而一个进程又是由多个线程所组成的 什么是线程? 线程 ...
- pc端的企业网站(IT修真院test8)详解1-2
今天接着说test8的页面还原. 头部header和尾部footer 我一开始是想直接使用bootstrap的栅格系统来实现的.但是内容的定位出了不少麻烦. 那么就索性用原生html+css来还原页面 ...