IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]Unity编辑器下 图集内精灵的获取

    u010019717发表于 2016-08-28 21:02:39
    love 0

    孙广东 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
        }
    





    


沪ICP备19023445号-2号
友情链接