zoukankan      html  css  js  c++  java
  • Unity3d通用工具类之NGUI图集分解

    ---恢复内容开始---

    Unity3d通用工具类之NGUI图集分解

    由于最近需要一些美术资源吗,但是无奈自己不会制作UI,所以就打算去网上的项目中直接找几张可以使用的贴图资源。

    但是发现这些资源已经被NGUI自带的打包图集工具打包好了,而且原小贴图也已经全部删掉了,只剩下一个预制物。

    那么这个预制物里面包含什么呢:

    1.一张大图集贴图

    2.大贴图的材质球

    3.挂上UIAtla脚本的预制物

    那么重点来了,我们该如何获取这张大贴图中的小贴图呢?

    这里我写了个小插件,我直接在NGUI源代码里面改:

    找到NGUI的源代码:UIAtlasMaker

    在OnGUI方法里面,我新添加了可以导出贴图的代码:

                GUILayout.BeginHorizontal();
                {
                    if (tex != null)
                    {
                        if (GUILayout.Button("导出贴图(PNG)",GUILayout.Width(120f)))
                        {
                            string filePath = EditorUtility.SaveFolderPanel("保存贴图到指定文件夹","","");
                            ExportTexturePNGFromAtlas(filePath, NGUISettings.atlas);
                        }
                    }
                }
                GUILayout.EndHorizontal();

    ExportTexturePNGFromAtlas():

        static void ExportTexturePNGFromAtlas(string folderPath,UIAtlas atlas)
        {
            List<UISpriteData> exitSpritesList = atlas.spriteList;
            Texture2D atlasTexture = NGUIEditorTools.ImportTexture(atlas.texture, true, false, !atlas.premultipliedAlpha);
            int oldwith = atlasTexture.width;
            int oldHeight = atlasTexture.height;
            Color32[] oldPixels = null;
            foreach (var es in exitSpritesList)
            {
                int xmin = Mathf.Clamp(es.x, 0, oldwith);
                int ymin = Mathf.Clamp(es.y, 0, oldHeight);
                int newWidth = Mathf.Clamp(es.width, 0, oldwith);
                int newHeight = Mathf.Clamp(es.height, 0, oldHeight);
                if (newWidth == 0 || newHeight == 0) continue;
                if (oldPixels == null) oldPixels = atlasTexture.GetPixels32();
                Color32[] newPixels = new Color32[newWidth * newHeight];
                for (int y = 0; y < newHeight; ++y)
                {
                    for (int x = 0; x < newWidth; ++x)
                    {
                        int newIndex = (newHeight - 1 - y) * newWidth + x;
                        int oldIndex = (oldHeight - 1 - (ymin + y)) * oldwith + (xmin + x);
                        newPixels[newIndex] = oldPixels[oldIndex];
                    }
                }
                Texture2D t = new Texture2D(newWidth, newHeight);
                t.SetPixels32(newPixels);
                t.Apply();
                byte[] bytes = t.EncodeToPNG();
                Texture2D.DestroyImmediate(t);
                t = null;
                if (!Directory.Exists(folderPath))
                {
                    Directory.CreateDirectory(folderPath);
                }
                using (FileStream fs = new FileStream(folderPath + "/" + es.name + ".png", FileMode.CreateNew))
                {
                    BinaryWriter writer = new BinaryWriter(fs);
                    writer.Write(bytes);
                }
            }
        }

    打开NGUI的Atlas Maker:

     点击导出贴图,然后会弹出选择保存贴图到哪个文件夹,点击选择文件夹之后,小贴图就导出成功了。

     

  • 相关阅读:
    STM8s窗口看门狗
    开篇
    习题6-8 统计一行文本的单词个数
    习题9-4 查找书籍
    习题9-3 平面向量加法
    习题9-1 时间换算
    习题7-8 字符串转换成十进制整数
    习题8-10 输出学生成绩
    习题7-7 字符串替换
    习题7-6 统计大写辅音字母
  • 原文地址:https://www.cnblogs.com/CaomaoUnity3d/p/6043395.html
Copyright © 2011-2022 走看看