Unity——资源管理工具_检查某个文件夹下的图片是否被 预制体 引用过

本文介绍了一个Unity编辑器脚本,用于检测项目中未使用的图片资源。该脚本通过遍历指定的图片和预制体文件夹,检查图片是否在任何预制体中被引用,从而找出可能可以清理的冗余图片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、策划需要进行资源管理,所以要知道某个文件夹下的图片有没有用到。

二、效果如下:

三、代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
using UnityEngine.UI;
public class FindTrashRes : Editor {


	public static string prefabPath  = "Assets/GameData/UI/Prefab";
	public static string texturePath = "";

	[MenuItem("Assets/FindTrashRes(检查未使用的图片)")]
	private static void Check(){
		if (Selection.activeObject != null ) {
			if(Selection.activeObject.GetType () == typeof(DefaultAsset)){
				texturePath = AssetDatabase.GetAssetPath((DefaultAsset)Selection.activeObject);
				CheckTextureForPrefab ();
			}
		}
	}

	private static void CheckTextureForPrefab(){
		string log = "检查  图片文件夹:"+texturePath+"\t预制体文件夹:"+prefabPath;
		Hashtable texturePathTab = new Hashtable ();
		DirectoryInfo textureDir = new DirectoryInfo(texturePath);
		DirectoryInfo prefabDir = new DirectoryInfo(prefabPath);

		//获取全部图片文件
		FileInfo[] files = textureDir.GetFiles("*.jpg",SearchOption.AllDirectories);
		EditorUtility.DisplayProgressBar ("查找文件夹下所有图片", "", 0);
		for (int i = 0; i < files.Length; i++) {
			string subPath = files [i].FullName.Remove(0,Application.dataPath.Length-6);
			subPath = subPath.Replace ("\\","/");
			texturePathTab.Add (subPath, "");
		}
		files = textureDir.GetFiles("*.png",SearchOption.AllDirectories);
		string tlog = "";
		for (int i = 0; i < files.Length; i++) {
			string subPath = files [i].FullName.Remove(0,Application.dataPath.Length-6);
			subPath = subPath.Replace ("\\","/");
			texturePathTab.Add (subPath, "");
		}

		EditorUtility.DisplayProgressBar ("查找文件夹下所有图片", "", 1);

		//判断是否被使用过
		files = prefabDir.GetFiles("*.prefab",SearchOption.AllDirectories);
		for(int i=0;i<files.Length;i++){
			EditorUtility.DisplayProgressBar ("检查预制体", files[i].Name, i/(float)files.Length);
			string subPath = files [i].FullName.Remove(0,Application.dataPath.Length-6);
			GameObject obj = AssetDatabase.LoadAssetAtPath(subPath, typeof(GameObject)) as GameObject;
			Image[] images = obj.GetComponentsInChildren<Image> ();
			for(int im=0;im<images.Length;im++){
				var texture = images [im].mainTexture;
				if (texture != null) {
					string assetPath = AssetDatabase.GetAssetPath (texture);
					if (texturePathTab.ContainsKey (assetPath)) {
						texturePathTab[assetPath]=subPath.Remove(0,prefabPath.Length+1);
					}
				}
			}
		}
		//合成打印日志
		EditorUtility.DisplayProgressBar ("合成打印日志", "", 0);
		log += "\n未被使用的图片:";
		foreach (string k in texturePathTab.Keys)
		{
			string prefab_path = (string)texturePathTab[k];
			if (string.IsNullOrEmpty (prefab_path)) {
				log += ("\n"+k.Remove(0,texturePath.Length+1));
			}
		}
		log += "\n\n\n被使用过的图片:";
		foreach (string k in texturePathTab.Keys)
		{
			string prefab_path = (string)texturePathTab[k];
			if (!string.IsNullOrEmpty (prefab_path)) {
				log += ("\n图片:"+k.Remove(0,texturePath.Length+1)+"\t使用的预制体:"+prefab_path);
			}
		}
		EditorUtility.DisplayProgressBar ("合成打印日志", "", 1);
		Debug.Log (log);
		EditorUtility.ClearProgressBar ();
	}



}

 

### Unity预制体使用教程与最佳实践 #### 预制体概述 在Unity中,预制体(Prefab)是一种可重复使用的资源实例模板。通过创建和管理预制体,开发者可以在场景中多次重用相同的对象配置而无需手动复制粘贴组件属性。这不仅提高了工作效率还便于维护统一的对象状态。 #### 创建预制体的方法 为了创建一个新的预制体,在Hierarchy视图中选中目标GameObject并将其拖拽到Project窗口内的任意文件夹下即可完成操作[^1]。此时该物体即被转换成一个预制件形式存储于工程目录之中;与此同时原位置上的实体会自动转变为预制体的一个具体化副本。 #### 修改预制体及其变种 当需要调整某个特定实例而不影响其他相同类型的物件时,则可以通过右键点击此实例选择“Make Prefab Variant”。这样做的好处在于既保留了原始版本又允许单独定制新产生的变异版,从而实现更灵活的设计需求。 对于想要同步更改所有关联着同一原型的个体而言,只需直接编辑位于Assets中的源Prefabs文件就好——任何改动都会立即反映给每一个对应的Scene里的引用项。 #### 性能优化建议 为了避免不必要的开销以及提升加载速度等方面的表现力,应当遵循如下几条原则来处理预制体: - 尽量减少复杂度较高的视觉效果或者逻辑运算存在于频繁实例化的预制体内; - 合理规划好各个模块之间的依赖关系以防止循环引用造成内存泄漏等问题发生; - 利用Object Pooling技术预先准备好一批待激活的游戏对象池子供即时调用而不是每次都临时new出来再destroy掉。 ```csharp // ObjectPoolingManager.cs 示例代码片段展示如何高效利用对象池机制 public class ObjectPoolingManager : MonoBehaviour { private Dictionary<string, Queue<GameObject>> _poolDictionary; void Start() { _poolDictionary = new Dictionary<string, Queue<GameObject>>(); } public GameObject GetPooledObject(string tag) { if (!_poolDictionary.ContainsKey(tag)) return null; var queue = _poolDictionary[tag]; if (queue.Count == 0) { Debug.LogWarning($"Pool of {tag} is empty!"); return null; } return queue.Dequeue(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值