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
}




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

unity 读取精灵图Sprite

在UIj界面搭建时,通过Unity自带的工具将一张图片切成许多小图 在代码里读取一个图片下的N个小图片 废话不多说,上代码 private sprite[]  emojSprite=Resour...
  • m0_37583098
  • m0_37583098
  • 2017年06月15日 20:28
  • 948

Unity项目UI图片压缩格式(UGUI)

UI制作时候使用的是Ps 8位 RGB通道的色彩。 但导出的是16位RGBA色彩的图片。 压缩格式都要求贴图宽高为2的N次幂,一般的精灵或贴图很难切成2的N次幂。 但是打成图集后宽高都是...
  • zakerhero
  • zakerhero
  • 2016年11月18日 10:21
  • 1625

unity sprite怎么获取切割后的图

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

Unity3D-UGUI图集打包与动态使用(TexturePacker)

本站文章转载务必在明显处注明:原文链接  前言 在用UGUI时,我们也需要将一个个小图打包成图集,以减小Drawcall(类似coco2d-x一样,打包成图集一次性加载以内存换取图片读取效率),...
  • CJsen
  • CJsen
  • 2016年09月09日 17:04
  • 14086

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

Sprite Packer打包 动态改变精灵物体的图片 1.改变这个原有的精灵的图片 2.在资源库里面生成一个新的精灵 ---------1.改变这个原有的精灵的图片 首先在这个。C...
  • BuladeMian
  • BuladeMian
  • 2016年12月28日 16:10
  • 4243

在unity项目中查找图片应用

  • 2016年02月26日 17:11
  • 1KB
  • 下载

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

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

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

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

Unity5 Sprite 图集打包 AssetBundle 更新探索

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

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

在我们找资源的时候,有时候会遇到那种把一堆图片放进一张png图片里面的情况,在做2D游戏的时候,我们往往需要将里面的一块块小图片切割出来使用,那么问题就来了,怎么切割呢,现在我们提供一张小图片,给大家...
  • a3636987
  • a3636987
  • 2015年04月12日 17:26
  • 7947
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity编辑器下 图集内精灵的获取
举报原因:
原因补充:

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