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) { }
		}
	}
}

  

时间: 2024-11-04 14:13:28

Unity3d 检查哪些prefab引用了某个UIAtlas的相关文章

Unity3D研究之Prefab里面的Prefab关联问题

Unity研究院之Prefab和GameObject的正向和逆向查找引用 我发现很多美工兄弟都爱问程序Unity3d为什么总丢材质? 我不排除U3d有BUG的情况下会丢材质?但是其实很多时候是人为操作而引起的. 1.不保存就在上传 这个操作太恐怖了,切记!!在 U3D里面你无论操作了什么,当你要上传svn的时候一定要先保存场景,Ctrl+S 切记切记!!如果不保存就上传很有可能就会丢材质. 2.我的电脑明明没事,怎么你哪里就丢材质? 我发现一个很有意思的现象,每次走到美术电脑前看它的svn工程时

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

在我们做项目的过程中 经常会有预设中出现空的脚本 例如: 导致的原因是因为 脚本的丢失 现在我们来做一个检查工程中有空脚本的预设工具 老规矩直接上代码 放到工程就能用 using UnityEngine; using UnityEditor; using System.IO; using System.Collections.Generic; public class PrefabTool : EditorWindow { [MenuItem("Prefab Tool/Check Missing

Unity3D研究院之Prefab里面的Prefab关联问题

最近在做UI部分中遇到了这样的问题,就是Prefab里面预制了Prefab.可是在Unity里面一旦Prefab预制了Prefab那么内部的Prefab就失去关联.导致与如果要改内部的Prefab需要把所有引用的地方全部改一遍.今天在逛国外网站看到了一个老外的思路,原文在这里 http://framebunker.com/blog/poor-mans-nested-prefabs/下面直接上代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

[Unity3D]引擎崩溃、异常、警告、BUG与提示总结及解决方法

1.U3D经常莫名奇妙崩溃.   一般是由于空异常造成的,多多检查自己的引用是否空指针. 2.编码切换警告提示.   警告提示:Some are Mac OS X (UNIX) and some are Windows. This might lead to incorrect line numbers in stacktraces and compiler errors. Many text editors can fix this using Convert Line Endings men

Prefab和GameObject的正向和逆向查找

我发现很多美工兄弟都爱问程序unity3d为什么总丢材质? 我不排除U3d有BUG的情况下会丢材质?但是其实很多时候是人为操作而引起的. 1.不保存就在上传这个操作太恐怖了,切记!!在 U3D里面你无论操作了什么,当你要上传svn的时候一定要先保存场景,Ctrl+S 切记切记!!如果不保存就上传很有可能就会丢材质. 2.我的电脑明明没事,怎么你哪里就丢材质?我发现一个很有意思的现象,每次走到美术电脑前看它的svn工程时,我都会发现各种的“黄叹号”整个工程严重的冲突.然后程序和美术的对话就是:“这

Unity3D占用内存太大的解决方法

原文链接:http://www.cnblogs.com/88999660/archive/2013/03/15/2961663.html 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大. Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBund

Unity3D占用内存太大的解决方法【先转,慢慢看】

Unity3D占用内存太大的解决方法 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大. Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时 动态加载,可以指定路径和来源的. 其实场景里所有静态的对象也有这么一

值传递,指针传递;引用传递(c++独有)本质

要理解值传递.指针传递和引用传递的区别,主要要理解函数的实参和形参,函数的作用域(自动变量.栈),内存的布局以及指针和引用的特点.这里主要总结三种参数传递方式使用的主要场合. 值传递:只给函数提供输入值,需要复制开销,大对象很少使用值传递. 指针传递:可以改变指针指向内容的值,但是不能改变指针本身,无需复制开销.如果需要改变指针本身,可以使用二重指针或者指针引用. 引用传递:除了提供输入值外,还返回操作结果,无需复制开销. #include<stdlib.h> //值传递,函数体内变量n是参数

C语言学习笔记 (002) - C++中引用和指针的区别(转载)

下面用通俗易懂的话来概述一下: 指针-对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,如const.volatile等等.见下图,所示指针的含义: 引用-引用是一个对象的别名,主要用于函数参数和返回值类型,符号X&表示X类型的引用.见下图,所示引用的含义: 2.指针和引用的区别 首先,引用不可以为空,但指针可以为空.前面也说过了引用是对象的别名,引用为空--对象都不存在,怎么可能有别名!故定义一个引用的时候,必须初始化.因此