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

原创 2016年08月29日 22:12:13

孙广东 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("Custom / 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
}




版权声明:本文为博主原创文章,未经博主允许不得转载。出自 游戏开发实验室_孙广东

相关文章推荐

在Unity3D中加载外部图片的两种方法

喜欢我的博客请记住我的名字:秦元培,我的博客地址是:http://qinyuanpei.com 转载请注明出处,本文作者:秦元培, 本文出处:http://blog.csdn.net/qinyu...

unity学习笔记-精灵集和精灵动画

2D游戏中,对精灵的操作需求,往往是两点: 1、 静态精灵:一般做背景展示等 2、 精灵动画:帧动画、骨骼动画等 声明:以下对Unity的操作,基于Unity3D 4.3.4,本人初学Unity,没用...

关于Unity5.3UGUI图集的使用方法

1、将所需要的图片导入Unity中,注意不能放在Resources文件夹下 2、选择需要打包成图集的图片(可以多选)在inspector面板里选择“Texture Type“为“Sprite (2D...

Unity中2D和UGUI图集的理解与使用

图集 什么是图集? 在使用3D技术开发2D游戏或制作UI时(即使用GPU绘制),都会使用到图集,而使用CPU渲染的2D游戏和UI则不存在图集这个概念(比如Flash的原生显示列表),那么什么是...

Unity5 Sprite 图集打包 AssetBundle 更新探索

自从Unity 提供 Sprite Packer 方案,精灵图片就不需要自己来合并图集了,而是设置 Packing Tag 就会使得 Unity 自动帮我们合并图集。但是做资源更新的时候,自动生成的图...
  • akof1314
  • akof1314
  • 2015年09月11日 18:51
  • 21392

unity sprite怎么获取切割后的图

学习了一段时间的unity,对里面的组件有一个大致的了解,但是具体操作来说还不是很熟悉,今天看了一片关于unity sprite怎么获取切割后的图的文章,感觉还不错。 假设有一张png/tga图...
  • OnafioO
  • OnafioO
  • 2015年04月21日 18:57
  • 6905

Unity的2D图集处理,并切割出一张张小图片

在我们找资源的时候,有时候会遇到那种把一堆图片放进一张png图片里面的情况,在做2D游戏的时候,我们往往需要将里面的一块块小图片切割出来使用,那么问题就来了,怎么切割呢,现在我们提供一张小图片,给大家...

Unity 打图集Atlas

这一节我们来写一下怎么用代码吧很多图片打到一个图集中(也就是一个大图片中) 在Unity中我们可以设置图片的Packing Tag来制定图片所属的图集,Unity运行的时候会把相同图集的图片合批...

Unity里获取Material里所有的Texture

背景:通过Material获取Texture的接口有:Material.mainTexture, Material.GetTexture(string propertyName); 但没有一个接口可以...
  • cbbbc
  • cbbbc
  • 2016年01月26日 16:17
  • 1522

【Unity&UGUI】动态改变精灵物体的图片

Sprite Packer打包 动态改变精灵物体的图片 1.改变这个原有的精灵的图片 2.在资源库里面生成一个新的精灵 ---------1.改变这个原有的精灵的图片 首先在这个。C...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity编辑器下 图集内精灵的获取
举报原因:
原因补充:

(最多只允许输入30个字)