孙广东 2015.12.11
Unity中的图集打包工具没有提供这个功能。 没有更好的方法。
可以选择图集, 查看里面的都包括哪些资源
然后可以点击资源, 就会在 Project 面板中选择到指定的资源了。
using UnityEngine; using UnityEditor; using UnityEditor.Sprites; using System.Collections.Generic; using System.IO; using System.Linq; /// <summary> /// 描述:图集相关 /// author: 孙广东 /// 两种方式:1、使用Unity的API根据图集名得到精灵(不行!), 2、全盘搜索到所有精灵。根据图集进行分类 /// </summary> [AddComponentMenu("DajiaGame/Px/ AtlasPackerEditorWindow ")] public class AtlasPackerEditorWindow : EditorWindow { #region ===字段=== private string inputText = "name"; private Vector2 scrollPos; private static AtlasPackerEditorWindow window; private static Vector2 WindowMinSize = new Vector2(256, 256); // 要检查的资源有 private static string[] assetTypes = new[] { "png", "jpg" }; private static List<string> assetList = new List<string>(); private static Dictionary<string, List<string>> atlasData = new Dictionary<string, List<string>>(); private List<string> assetPaths = new List<string>(); #endregion #region ===属性=== #endregion #region ===Unity事件=== 快捷键: Ctrl + Shift + M /Ctrl + Shift + Q 实现 /// <summary> /// 主要在这里显示内容 /// </summary> void OnGUI() { EditorGUILayout.Space(); EditorGUILayout.BeginVertical(); EditorGUILayout.BeginHorizontal(); GUILayout.Label("输入图集名然后确定"); //if (Selection.activeGameObject) inputText = EditorGUILayout.TextField(inputText); this.Repaint(); if (GUILayout.Button("选择图集")) { GenericMenu menu = new GenericMenu(); foreach (KeyValuePair<string, List<string>> keyValuePair in atlasData) { menu.AddItem(new GUIContent(keyValuePair.Key), false, ClickGenericMenu, keyValuePair.Key); menu.AddSeparator(""); } menu.ShowAsContext(); } if (GUILayout.Button("确定")) { // 获取到所有的数据 if (atlasData.Keys.Contains(inputText)) { assetPaths = atlasData[inputText]; } else { window.ShowNotification(new GUIContent(" 不存在这个图集 ")); } //currentTexture2Ds = Packer.GetTexturesForAtlas(inputText/*"Bag"*/); } if (GUILayout.Button("刷新")) { Init(); } EditorGUILayout.EndHorizontal(); scrollPos = EditorGUILayout.BeginScrollView(scrollPos); for (int n = 0; n < assetPaths.Count; n++) { if (GUILayout.Button(new GUIContent(AssetDatabase.LoadAssetAtPath<Texture>(assetPaths[n])))) { Selection.activeObject = AssetDatabase.LoadAssetAtPath<Sprite>(assetPaths[n]); } } EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); } // 选择了指定的 图集名 private void ClickGenericMenu(object userData) { inputText = userData.ToString(); } #endregion #region ===方法=== [MenuItem("DajiaGame/图集内精灵的获取... %#&X")] //快捷键:ctrl + shift + Alt +p, static void Open() { window = (AtlasPackerEditorWindow)EditorWindow.GetWindow<AtlasPackerEditorWindow>("图集内精灵的获取"); window.minSize = WindowMinSize; //window.ShowNotification(new GUIContent("亲! 欢迎使用本工具 - PX")); window.Show(); Init(); } private static void Init() { // 得到所有资源 for (int i = 0; i < assetTypes.Length; i++) { var lists = Directory.GetFiles(Application.dataPath, string.Format("*.{0}", assetTypes[i]), SearchOption.AllDirectories); for (int j = 0; j < lists.Length; j++) { if (lists[j].Contains("Addon") || lists[j].Contains("Standard Assets")) { continue; } string assetPath = lists[j].Substring(lists[j].IndexOf("Assets")); TextureImporter textureImporter = TextureImporter.GetAtPath(assetPath) as TextureImporter; string packingName = textureImporter.spritePackingTag; //Debug.Log("图集名称:" + packingName); if (!packingName.IsNullOrEmpty()) { if (!atlasData.Keys.Contains(packingName)) { atlasData.Add(packingName, new List<string>() { assetPath }); } else { atlasData[packingName].Add(assetPath); } } assetList.Add(lists[j]); } } } // 后处理的固定设置! void OnPostprocessTexture(Texture2D texture) { //string AtlasName = new DirectoryInfo(Path.GetDirectoryName(assetPath)).Name; //TextureImporter textureImporter = assetImporter as TextureImporter; //textureImporter.textureType = TextureImporterType.Sprite; //textureImporter.spritePackingTag = AtlasName; //textureImporter.mipmapEnabled = false; } #endregion }