Unity3d 检查哪些prefab引用了某个UIAtlas
适用情景:策划在用NGUI制作UI prefab时经常会使用一些临时的Atlas,然后再想改就不知道都哪些使用了。现在想修改下使用临时资源的GameObject
使用方式,先选中某个prefab或者某个包含prefab的文件夹,点Tools->Find atlas reference object in current select->输入Atlas的名字,不用带缀名
代码
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Collections.Generic;
using System.IO;
public class FindAtlasReference : ScriptableWizard
{
[Tooltip("Atlas Name")]
public string AtlasName; // Use this for initialization
void Start()
{ } [MenuItem("Tools/Find atlas reference object in current select")]
public static void OpenDialog()
{
DisplayWizard<FindAtlasReference>("Find object using this atlas", "Find", "Cancel");
} void OnWizardCreate()
{
Find();
}
void OnWizardOtherButton()
{
Close();
} public void Find()
{
if (string.IsNullOrEmpty(AtlasName))
{
return;
} var objs = Selection.objects; List<string> strList = new List<string>();
int i = 0;
foreach (var obj in objs)
{
EditorUtility.DisplayProgressBar(AtlasName, obj.name, i * 1.0f / objs.Length); if (IsAssetAFolder(obj))
{
var path = AssetDatabase.GetAssetPath(obj.GetInstanceID());
var pathList = new List<string>();
GetPath(path, pathList, "*.prefab");
foreach (var p in pathList)
{
strList.AddRange(FindInAsset(p));
}
}
else if (obj as GameObject)
{
strList.AddRange(FindInAsset(obj as GameObject));
}
i++;
} EditorUtility.ClearProgressBar();
foreach (var str in strList)
{
Debug.Log(str);
}
Debug.Log("Using [" + AtlasName + "] Total=" + strList.Count.ToString() + "------------------------------------------end");
} public List<string> FindInAsset(string path)
{
var obj = AssetDatabase.LoadAssetAtPath(path, typeof(GameObject)) as GameObject;
if (null != obj)
{
return FindInAsset(obj);
}
return new List<string>();
} public List<string> FindInAsset(GameObject asset)
{
var str = new List<string>(); var go = GameObject.Instantiate(asset) as GameObject;
go.name = asset.name;
go.SetActiveRecursively(true);
var uis = go.transform.GetComponentsInChildren<UISprite>();
foreach (var ui in uis)
{
if (null != ui.atlas && ui.atlas.name.Contains(AtlasName))
{
str.Add(ui.transform.FullPath());
}
} GameObject.DestroyImmediate(go); return str;
} private static bool IsAssetAFolder(Object obj)
{
string path = ""; if (obj == null)
{
return false;
} path = AssetDatabase.GetAssetPath(obj.GetInstanceID()); if (path.Length > 0)
{
if (Directory.Exists(path))
{
return true;
}
else
{
return false;
}
} return false;
} void GetPath(string path, List<string> pathList, string filter = "*")
{ if (path != null)
{
string[] f1 = Directory.GetFiles(path, filter); ;
string[] d1; foreach (string f11 in f1)
{
pathList.Add(f11);
}
try
{
d1 = Directory.GetDirectories(path);
foreach (string d11 in d1)
{
try
{
GetPath(d11, pathList, filter);
}
catch (System.Exception) { }
}
}
catch (System.Exception) { }
}
}
}
Unity3d 检查哪些prefab引用了某个UIAtlas的更多相关文章
- Unity3D研究之Prefab里面的Prefab关联问题
Unity研究院之Prefab和GameObject的正向和逆向查找引用 我发现很多美工兄弟都爱问程序Unity3d为什么总丢材质? 我不排除U3d有BUG的情况下会丢材质?但是其实很多时候是人为操作 ...
- Unity Editor 检查工程Prefab(预设)中的空组件
在我们做项目的过程中 经常会有预设中出现空的脚本 例如: 导致的原因是因为 脚本的丢失 现在我们来做一个检查工程中有空脚本的预设工具 老规矩直接上代码 放到工程就能用 using UnityEngin ...
- Unity3D研究院之Prefab里面的Prefab关联问题
最近在做UI部分中遇到了这样的问题,就是Prefab里面预制了Prefab.可是在Unity里面一旦Prefab预制了Prefab那么内部的Prefab就失去关联.导致与如果要改内部的Prefab需要 ...
- Unity3D研究院之Prefab里面的Prefab关联问题(转)
转自http://www.xuanyusong.com/archives/3042 最近在做UI部分中遇到了这样的问题,就是Prefab里面预制了Prefab.可是在Unity里面一旦Prefab预制 ...
- unity3d MonoDevelop引用外部自定义dll文件报错:are you missing an assembly reference?
在unity3d 编辑器 MonoDevelop 中引用外部自定义dll文件报错:are you missing an assembly reference? 因为unity还停留在.NET Fram ...
- Unity3D 学习笔记
不是什么技术文章,纯粹是我个人学习是遇到一些觉得需要注意的要点,当成笔记. 1.关于调试,在Android下无法断点,Debug也无法查看,查看日志方法可以启动adb的log功能,或者自己写个GUI控 ...
- Editor扩展之查看Prefab用在那儿
Prefab查找需求 在项目开发阶段的中后期,工程中有越来越多的Prefab,当我们要修改一个prefab或删除无用的prefab时,或许我们不是那么清楚该prefab在那些场景中使用着或从未使用过, ...
- Unity3D]引擎崩溃、异常、警告、BUG与提示总结及解决方法
此贴会持续更新,都是项目中常会遇到的问题,总结成贴,提醒自己和方便日后检查,也能帮到有需要的同学. 若各位有啥好BUG好异常好警告好崩溃可以分享的话,请多多指教.xuzhiping7#qq.com. ...
- Unity3D占用内存太大的解决方法
原地址:http://www.cnblogs.com/88999660/archive/2013/03/15/2961663.html 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大 ...
随机推荐
- 浅谈T-SQL中的特殊联结
引言 上一篇博客我们介绍了交叉联接,内联接,外联接3种基本的联接操作.这一篇文章我们介绍一些特殊的联接操作. 组合联接 组合联接就是联接条件涉及到联接两边的多个列的查询.当需要根据主键-外键关系来联接 ...
- mysql数据库存储过程异常处理
14.1.4 定义条件和处理程序 定义条件和处理程序是事先定义程序执行过程中可能遇到的问题.并且可以在处理程序中定义解决这些问题的办法.这种方式可以提前预测可能出现的问题, 并提出解决办法.这样可以 ...
- Linux操作、hadoop和sh脚本小结
近期一直在忙项目上的事情,今天对以前的工作做一个简单的小结.明天就是国庆节啦. 1 脚本可以手动执行,可是crontab缺总是找不到路径? #!/bin/bash. /etc/profile . / ...
- SQl语句学习笔记(二)
merge into when matched then... when not mached then... merge into t_road_pre_parameter a fr ...
- VTK初学一,a Mesh from vtkImageData
#ifndef INITIAL_OPENGL #define INITIAL_OPENGL #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRend ...
- Ruby学习之module
我们可以认为module是一个专门存放一系列方法和常量的工具箱. module和class非常像, 只是module不能创建实例也不能有子类, 它们仅仅能存放东西. 例如: module Circle ...
- 串行移位锁存并行输出可级联器件74HC595
一.背景 老同学今天突然咨询关于74HC595,自己没用过,同学说可以级联10级!10级?我艹,这么叼,级联又是 什么鬼,这勾起了我极大兴趣,二话不说,手册down下来研究,并在此做个记录. 二.正文 ...
- sql存储过程几个简单例子
导读:sql存储是数据库操作过程中比较重要的一个环节,对于一些初学者来说也是比较抽象难理解的,本文我将通过几个实例来解析数据库中的sql存储过程,这样就将抽象的事物形象化,比较容易理解. 例1: cr ...
- linux 模块加载
错误: rmmod 时提示 rmmod: chdir(xxx): No such file or directory 解决方法: http://blog.csdn.net/luckywang1103/ ...
- 9 patch png 的上下左右
9 patch png 的上下左右 前言: 9 patch png 图片,扩展名为.9.png,是一个标准的PNG图像,它包括额外的1个像素的边界,通过对这个边界的描述来达到我们预期的拉伸效果.a ...