Editor扩展之查看Prefab用在那儿
Prefab查找需求
在项目开发阶段的中后期,工程中有越来越多的Prefab,当我们要修改一个prefab或删除无用的prefab时,或许我们不是那么清楚该prefab在那些场景中使用着或从未使用过,所以我就写了这么一个小工具,对选中的prefab进行检查。
当然我把这个小工具用于检查UI的prefab,对于其它类型的prefab它可能在任何场景都未使用,是在运行时动态加载的。所以当你要把一个prefab从工程中删除时一定要清楚该prefab是否真的没用
UI结构
这里所指的约束,大概就是比如:工程所有的UI场景都放在同一路径下,比如Asset\UI\xxx,所有UI场景的顶部分层次结构都相同,如下图所示:

编写工具
小工具功能
该插件代码主要有两个功能:
1、遍历路径下所有的UI场景,该callback,第1个参数是场景的根节点,第2个参数是路径名
public static void LoopUIScene(Action<Transform,string> uiWindow)
{
//当前这个工程的全部UI场景放在Assets/UI/TestScene下
foreach (var uiScene in Directory.GetFiles("Assets/UI/TestScene", "*.unity"))
{
EditorApplication.OpenScene(uiScene);
//TODO 补充判断异常,是否为空
var uiRoot = GameObject.Find("Window").transform;
uiWindow(uiRoot,uiScene);
}
}
2、查找当前UI场景所有的Gameobject是否是prefab,如果是,它和选中的prefab是同一个实例么? 如果是,输出日志
笔记
//transform是在Hierarchy视图的,转成project的prefab
UnityEngine.Object parentObject = PrefabUtility.GetPrefabParent(child);
工具源码
[MenuItem("Assets/选中的Prefab用在哪些场景?")]
private static void SearchPrefabReferences()
{
//确保鼠标右键选择的是一个Prefab
if (Selection.gameObjects.Length != 1)
{
return;
}
//遍历所有游戏场景
LoopUIScene((uiRoot,uiName) =>
{
//获取场景中的所有游戏对象,包括隐藏的
var childs = uiRoot.GetComponentsInChildren<Transform>(true);
foreach (Transform child in childs)
{
//判断GameObject的type是否是Prefab的引用
if (PrefabUtility.GetPrefabType(child) == PrefabType.PrefabInstance)
{
//transform是在Hierarchy视图的,转成project的prefab
UnityEngine.Object parentObject = PrefabUtility.GetPrefabParent(child);
string path = AssetDatabase.GetAssetPath(parentObject);
//判断GameObject的Prefab是否和右键选择的Prefab是同一路径。
if (path == AssetDatabase.GetAssetPath(Selection.activeGameObject))
{
//输出场景名,以及Prefab引用的路径
Debug.Log("场景名: "+uiName + " 引用路径: " + GetGameObjectPath(child.gameObject));
}
}
}
});
}
3、找到gameobject的完整路径
public static string GetGameObjectPath(GameObject obj)
{
string path = "/" + obj.name;
//一直往上找
while (obj.transform.parent != null)
{
obj = obj.transform.parent.gameObject;
path = "/" + obj.name + path;
}
return path;
}
使用方法
1、创建三个UI场景,一个UpFont.prefab,

2、Game和Game1两个场景都使用UpFont.prefab,Game2.unity则创建一个Gameobject的名字也为UpFont,但并没有引用UpFont.prefab



3、此时我们想知道UpFont.prefab究竟在哪些UI场景中使用了呢?选中UpFont.prefab 执行: 右键/选中的prefab用于哪些场景?

4、查看控制台的输出

Editor扩展之查看Prefab用在那儿的更多相关文章
- Unity3D Editor 扩展
官方教程:链接 EditorLayout API:链接 Handles API:链接 1.首先来个Inspector面板Editor的实现 要实现一个组件在Inspector中的Editor功能,首先 ...
- ubuntu 安装php 扩展和查看扩展包
利用ubuntu的软件包下载.安装工具:apt-get 输入下面的命令即可安装 php扩展库mcrypt.curl.gd库.mbstring.simplexml. apt-get install ph ...
- U3D之Editor扩展学习
Unity3D提供了强大的编辑器扩展机制,在项目开发中,如果可以将一些繁琐的工作放在编辑器扩展中进行,则会大大提高效率.本文对编辑器扩展进行了一些总结,希望对有兴趣编写编辑器扩展的开发人员有所帮助.当 ...
- 推荐一个有趣的Chrome扩展程序-查看任意网站的开发技术栈
对于前端开发人员来说,目前的前端框架层出不穷,最受欢迎的莫过于所谓的前端框架三驾马车:Angular, React和Vue.在学习的过程中,肯定好奇现在的互联网公司的网站用的何种前端框架来开发的. C ...
- U3D 自定义shader创建Editor扩展
“工欲善其事,必先利其器”Shader学习工具篇 最近一直忙于录制关于Shader入门的视频教程,其中一个反复的机械动作就是右键创建所需要的新Shader.悲剧的是每次打开的都是Unity3D默认的S ...
- easyUI datagrid editor扩展dialog
easyUI datagrid简单使用:着重两点1.editor对象的click事件:2.将dialog窗体内的值填写到当前正编辑的单元格内 <!DOCTYPE html> <htm ...
- 借助扩展事件查看SQL 2016备份和还原操作的内幕
当遇到备份或者还原操作占用较长时间时,很多人会问: 备份/还原是不是僵死了?要不要kill掉,再重来? 到底是哪一个部分的操作占用较长时间? 到底现在进行到什么阶段了? 在SQL 2016 之前,要回 ...
- bootstrap datatable editor 扩展
需求: a. 表单样式更改. b. 表单大小更改. 思路: a. 通过设置modal css更改样式和大小.缺点,全局性的更改. b. 更改bootstrap-editor,可以通过某种方式将参数传入 ...
- unity 查看prefab层次
点那个箭头,可以展开:
随机推荐
- 解决Visual Stuido 2013中Xamarin的*.axml文件没有智能提示问题
最近发现VS2013开发Android,发现.axml无法进行智能提示. 1.打开VS2013菜单栏中,点击工具--选项--文本编辑器--文件扩展名 2.增加一个扩展名为"axml" ...
- DevExpress 2015.2发布 看看有哪些更新
下面是besy翻译的部分重要更新,要查看全部更新细节请访问英文官网. | 下载DevExpress 2015.2 Diagram Control 新的DevExpress Diagram Contro ...
- Android JNI 和 NDK
1.Android NDK 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第 ...
- Android根据字符串加载Activity和图片
根据传入的字符串跳转Activity Intent intent = new Intent(context,Class.forName("com.packname.Activity" ...
- MVVM 模式下iOS项目目录结构详细说明
➠更多技术干货请戳:听云博客 我们在做项目的时候,会经常用到各种设计模式,最常见的要数 MVC (模型,视图,控制器)了.但是,今天我们要说的是另一种设计模式——MVVM. 所以 MVVM 到底是什么 ...
- iOS开发之多线程技术——NSOperation篇
本篇将从四个方面对iOS开发中使用到的NSOperation技术进行讲解: 一.什么是NSOperation 二.我们为什么使用NSOperation 三.在实际开发中如何使用NSOperation ...
- runtime之玩转成员变量
前言: 不铺垫那么多,单刀直入吧:runtime是一个C和汇编写的动态库,就像是一个小小的系统,将OC和C紧密关联在一次,这个系统主要做两件事情. 1,封装C语言的结构体和函数,让开发者在运行时创建, ...
- Java 线程池
系统启动一个线程的成本是比较高的,因为它涉及到与操作系统的交互,使用线程池的好处是提高性能,当系统中包含大量并发的线程时,会导致系统性能剧烈下降,甚至导致JVM崩溃,而线程池的最大线程数参数可以控制系 ...
- IntelliJ IDEA 导入新项目以后的简单配置
首先,配置Maven. 然后,配置Git. 选择自己调试要用的默认浏览器. 进行Edit Configurations 配置: 转载请注明出处! http://www.cnblogs.com/libi ...
- WPF学习之路(十四)样式和模板
样式 实例: <Window.Resources> <Style x:Key="BtnStyle"> <Setter Property=" ...