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:

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

时间: 2024-10-15 00:07:36

Unity3d通用工具类之NGUI图集分解的相关文章

Unity3d通用工具类之定时触发器

时隔多日,好不容易挤出点时间来写写博文.不容易,请送我几朵红花,点个赞也行. 今天呢,我们主要来扩展下通用工具类==>定时触发器. 顾名思义,所谓的定时触发器,就是告诉程序在过多长时间后,我要执行某个特定的任务. 比如举个小栗子: 电饭煲,相信大家都用过,当我们出去工作或者上学的时候,我们只要设置下煮饭时间,就可以安心的离开. 电饭煲会自动的开始计时工作,等到了你设置的时间后,他就会自动的开始煮饭啊什么的.而你却可以在远在千里的上班. 智能化,对就是这样的效果.我们今天就来写写这个智能的小东西.

Unity3d通用工具类之数据配置加载类

今天,我们来讲讲游戏中的数据配置加载. 什么是游戏数据加载呢?一般来说游戏中会有场景地图. 按照国际惯例,先贴一张游戏场景的地图: 在这张地图上,我们可以看到有很多正六边形,正六边形上有树木.岩石等. 哎!那么问题也就来了.大家会思考这张地图怎么啦.关游戏数据配置有什么关系?我们做好场景直接loding进来不就行了? 这也就是问题所在,如果你是直接loding进场景有很多问题: 1.场景是死的.只能是这个做好的场景.如果你想删除一些正六边形,想改变一些树木的位置,如何完成.有人会想,那我再做一个

Unity3d通用工具类之解压缩文件

今天,我们来写写c#是如何通过代码解压缩文件的. 在游戏的项目中呢,常常我们需要运用到解压缩的技术.比如,当游戏需要更新的时候,我们会从服务器中下载更新的压缩文件包. 这时候我们就需要解压文件,然后覆盖添加到游戏文件夹去,实现游戏的更新. 通常我们就需要通过代码来实现这一功能. 那么这里呢,我用的是第三发的压缩库,这个是用到一个dll,也就是ICSharpCode.SharpZipLib.Zip.dll 读者可以自行百度下载,这里我提供链接给你们: http://pan.baidu.com/s/

Unity3d通用工具类之生成文件的MD5

今天我们来写写工具类,这个类有什么用呢? 也就是无论你做什么项目,这个工具类你都可以拿来用,之所以通用,是可以适用所有项目. 这节我主要讲如何生成文件的MD5码. 那么这个MD5是个什么鬼东西,读者可以自行百度,其实简略的讲就是验证文件是否被篡改. 什么意思,比如当你去网站下载游戏的客户端软件,当有些黑客喜欢搞出点不好的事情,在你的客户端加些恶意代码之类的. 当黑客改了客户端文件,随之这个文件的MD5也改变了.所以我们只要验证用户下载的客户端的MD5和网站提供的MD5码是否一致,来判断是否要下载

Unity3D NGUI图集切成图片

Unity3D NGUI图集切成图片 有的时候用NGUI做好了图集,那么原图就没有必要放到Unity3D中了,严重影响Unity3D的速度.但是突然右想把图片弄出来.当然NGUI是提供了图集中单个图片另存,但是如果图片太多,比较费时间,所以用python写了个切图片的工具代码如下: Python环境:2.7 测试通过,需要依赖Image库 NGUI版本:3.7 #coding:utf-8 #unity 图集裁剪成png #Author:Wiker Yong #Date:2015-07-08 im

制作NGUI图集

导入NGUI后,右击在弹出窗中如图选择,打开Atlas Maker 到Project窗口中添加需要制作成图集的图片资源 选中要添加的图集资源,点击add/Update 重复以上操作即可完成需要制作的图集 U3D开发交流群: 312315390,欢迎加入交流公共学习进步 制作NGUI图集,布布扣,bubuko.com

Unity3D普通类和继承自MonoBehaviour类的区别

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,我们致力于打造业内unity3d培训.学习第一品牌. Unity3D普通类和继承自MonoBehaviour类的区别.如果创建新的类时,使用的是在unity editor的project视图中右键,create javascript or c#方式,那么创建的类都是默认继承自MonoBehaviour, 生成后可以查看类文件,会发现c#类继承自Mo

Android RecyclerView单击、长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类

?? Android RecyclerView单击.长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类 我写的附录文章2,介绍了Android如何基于OnItemTouchListener +GestureDetector实现单击.长按事件的监听,由于如今RecyclerView在Android开发是如此的普遍,以及RecyclerView的单击事件是如此的常用,如果像附录文章2那样把一堆事件监听写到业务逻辑代码里面,那得写

[NGUI]NGUI图集Atlas制作

1,在PS里面设计好要做的UI,然后切片成很多个png的图片(这属于美工的活啦,所以会描述的的比较简单点哈)2,在Unity中 Project下新建一个Folder,F2重命名为ResUI,以后就用来存放所有的UI,在ResUI里面重新新建一个Folder,我们这次以开始界面为例,因此F2重命名这个Folder为StartUI,这个StartUI用来存储关于开始界面的所有资源.[NGUI]NGUI图集Atlas制作简介" border="0" alt="转载 [NG