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...

Unity 2D 开发(1)精灵+精灵编辑_蓝鸥

Unity 2D 开发(1)精灵+精灵编辑:2D 中的所有图像我们都称之为精灵(Sprite)。精灵和标准的纹理几乎一样,但是采用了特殊的技术用来组合并管理精灵纹理,进而提高开发效率,使操作更便捷。U...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Unity 精灵图集Shader渲染错乱

在使用 Unity 开发游戏过程中,UI 界面上的表现有着举足轻重的地位,优秀的表现效果可以让游戏增色不少。要让 UI 精灵图片有独特的表现效果,需要给图片加上特定的 Shader 着色器,这样一来就...

Unity 2d精灵在编辑器中的一些简单操作

一、如何让导入的纹理,变成一个2d精灵? 有两种方法: 方法1: 首先,菜单:Edit-->Project Setting-->Editor,将Mode选项的值设置为2D;  然后,再将要制作精灵...

Unity编辑器扩展:如何把图集(Atlas)拆分成单个图片

游戏开发中可能会用到商店下载的图集,但是如果只是用到一部分,却把整个图集打包到项目则明显是不划算的。可以让美术同事单独把需要的图片切出来,但是图源比较多的话也是一个不小的工作。既然能够拿到切好的图集数...

unity 精灵切割

学习了一段时间的unity,对里面的组件有一个大致的了解,但是具体操作来说还不是很熟悉,今天看了一片关于unity sprite怎么获取切割后的图的文章,感觉还不错。   假设有一张图集,导入到Uni...

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

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

Cocos2dx获取精灵的高亮效果

CCSprite* getHighlightSprite(CCSprite* normalsprite) {     if ( !normalsprite) {         return C...

获取编辑框内容的方法

1.         int num1,num2,num3; char ch1[10],ch2[10],ch3[10]; GetDlgItem(IDC_EDIT1)->GetWi...

CEdit获取编辑框的内容

CEdit获取编辑框的内容 大家对获取编辑框的内容可能已经很熟悉了,无非是先定义一个CString类型的变量m_str,然后调用GetDlgItem(编辑框ID)->GetWindowText(st...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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