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用在那儿的更多相关文章

  1. Unity3D Editor 扩展

    官方教程:链接 EditorLayout API:链接 Handles API:链接 1.首先来个Inspector面板Editor的实现 要实现一个组件在Inspector中的Editor功能,首先 ...

  2. ubuntu 安装php 扩展和查看扩展包

    利用ubuntu的软件包下载.安装工具:apt-get 输入下面的命令即可安装 php扩展库mcrypt.curl.gd库.mbstring.simplexml. apt-get install ph ...

  3. U3D之Editor扩展学习

    Unity3D提供了强大的编辑器扩展机制,在项目开发中,如果可以将一些繁琐的工作放在编辑器扩展中进行,则会大大提高效率.本文对编辑器扩展进行了一些总结,希望对有兴趣编写编辑器扩展的开发人员有所帮助.当 ...

  4. 推荐一个有趣的Chrome扩展程序-查看任意网站的开发技术栈

    对于前端开发人员来说,目前的前端框架层出不穷,最受欢迎的莫过于所谓的前端框架三驾马车:Angular, React和Vue.在学习的过程中,肯定好奇现在的互联网公司的网站用的何种前端框架来开发的. C ...

  5. U3D 自定义shader创建Editor扩展

    “工欲善其事,必先利其器”Shader学习工具篇 最近一直忙于录制关于Shader入门的视频教程,其中一个反复的机械动作就是右键创建所需要的新Shader.悲剧的是每次打开的都是Unity3D默认的S ...

  6. easyUI datagrid editor扩展dialog

    easyUI datagrid简单使用:着重两点1.editor对象的click事件:2.将dialog窗体内的值填写到当前正编辑的单元格内 <!DOCTYPE html> <htm ...

  7. 借助扩展事件查看SQL 2016备份和还原操作的内幕

    当遇到备份或者还原操作占用较长时间时,很多人会问: 备份/还原是不是僵死了?要不要kill掉,再重来? 到底是哪一个部分的操作占用较长时间? 到底现在进行到什么阶段了? 在SQL 2016 之前,要回 ...

  8. bootstrap datatable editor 扩展

    需求: a. 表单样式更改. b. 表单大小更改. 思路: a. 通过设置modal css更改样式和大小.缺点,全局性的更改. b. 更改bootstrap-editor,可以通过某种方式将参数传入 ...

  9. unity 查看prefab层次

    点那个箭头,可以展开:

随机推荐

  1. 批量另存mxd

    在GIS数据处理中,批量操作是经常遇到的问题,Python脚本是解决问题的最好方法.现在需要将arcgis10.1的mxd另存为10.0,不仅数量较多,而且每个mxd要素和标注非常多,手动来操作确实慢 ...

  2. Autodesk的照片建模云服务—Autodesk ReCap 360 photo

    现实捕捉技术方兴未艾,简单的讲现实捕捉技术就是把现实中的现状信息数字化到计算机中以便做进一步的处理.对于不同的应用目的会有不同的捕捉设备,工程或传媒娱乐行业中经常用到的肯定就是三维模型了.那如何得到三 ...

  3. Android 隐式意图和显示意图的使用场景

    本文实现一个隐式意图的应用,激活短信应用 public void click4(View view) { Intent intent = new Intent(); intent.setAction( ...

  4. iOS底层基础知识-文件目录结构

    一:iOS沙盒知识 出于安全考虑,iOS系统把每个应用以及数据都放到一个沙盒(sandbox)里面,应用只能访问自己沙盒目录里面的文件.网络资源等(也有例外,比如系统通讯录.照相机.照片等能在用户授权 ...

  5. Android常用抓包工具之TcpDump

    ➠更多技术干货请戳:听云博客 做为一个测试人员,工作中经常会用到数据抓包工具来进行数据分析和验证,下面就简单介绍一下工作中常用的抓包工具. TcpDump抓包 Tcpdump是一个用于截取网络分组,并 ...

  6. 转大写字母-(ASCII表)

    #include<stdio.h> /* 转大写,ASCII表.大写与小写相差32 */ char upper(char c) { if(c>='a'&&c<= ...

  7. Asp.net Mvc 多级控制器 路由重写 及 多级Views目录 的寻找视图的规则 (多级路由) 如:Admin/Test/Index

    http://blog.csdn.net/buhuan123/article/details/26387427 目录(?)[-] 1那么我们再来看我们需要的访问方式如下图 razor视图的地址写成通配 ...

  8. GridView 和DataGrid区别

    转自:http://blog.csdn.net/51357/article/details/1480599 近期在维护一个vs2008开发的项目(该项目是从Vs2013拷贝升级过来的),发现不同时期按 ...

  9. 区别和详解:js中call()和apply()的用法

    1.关于call()和apply()的疑点: apply和call的区别在哪里 什么情况下用apply,什么情况下用call apply的其他巧妙用法(一般在什么情况下可以使用apply) 2.语法和 ...

  10. js中的==运算: [''] == false —>true

    图1 计算下面表达式的值: [''] == false 首先,两个操作数分别是对象类型.布尔类型.根据图1,需要将布尔类型转为数字类型,而false转为数字的结果是0,所以表达式变为: [''] == ...