NGUI 图集解包的实现
来源:互联网 发布:php kahlan 编辑:程序博客网 时间:2024/05/17 22:33
最近写Demo的时候从网上找资源,发现了一个项目源码,发现里面的UI是用NGUI实现,图片已经打包成了图集,而原先的散图已经被删除了(确实在正常的项目中这些散图被打包成图集之后就没用了,留在项目中白白增大包体)但是我希望拿到这些散图,在我自己的项目中使用UGUI搭建UI。所以有了这个需求。
核心代码不多,是取自NGUI中UIAtlasInspector中的代码
图中是代码原文
我给封装成了函数,便于调用:
/// <summary> /// 保存图集中的图片 /// </summary> /// <param name="_atlas">图片所在的图集</param> /// <param name="_sprite">图集中要保存的图片名字</param> /// <param name="_path">要保存的路径</param> public static void SaveSpriteAsTexture(UIAtlas _atlas, string _sprite, string _path) { UIAtlasMaker.SpriteEntry se = UIAtlasMaker.ExtractSprite(_atlas, _sprite); if (se != null) { byte[] bytes = se.tex.EncodeToPNG(); System.IO.File.WriteAllBytes(_path, bytes); AssetDatabase.ImportAsset(_path); if (se.temporaryTexture) Object.DestroyImmediate(se.tex); } }
以这个函数为核心,我实现了将整个图集保存的函数,其核心原理是遍历图集中的所有图片,然后调用上述函数进行保存,而在这个函数中我没有设置开放性的路径参数,这个可以根据实际应用进行修改。
/// <summary> /// 将图集中的所有图片拆分并保存 /// </summary> /// <param name="_atlas">图集</param> /// <param name="_refresh">是否立即更新</param> public static void CutTextures(UIAtlas _atlas, bool _refresh = true) { // 验证参数有效性 if (!_atlas) return; // 创建路径 if (!System.IO.Directory.Exists(Application.dataPath + "/AtlasTextures")) { AssetDatabase.CreateFolder("Assets", "AtlasTextures"); } if (!System.IO.Directory.Exists(Application.dataPath + "/AtlasTextures/" + _atlas.name)) { AssetDatabase.CreateFolder("Assets/AtlasTextures", _atlas.name); } // 开始 var sprites = _atlas.GetListOfSprites(); foreach(string spriteName in sprites) { string path = Application.dataPath + "/AtlasTextures/" + _atlas.name + "/" + spriteName + ".png"; SaveSpriteAsTexture(_atlas, spriteName, path); } if (_refresh) AssetDatabase.Refresh(); }
有了这两个实现核心功能的函数,接下来就简单了,只要在合适的时候调用即可,我再此处是点击了菜单栏的相应项目后,获取选中的所有图集,然后遍历保存:
[MenuItem("NGUI Sprite Unpacker/Sprite Unpacker")] static void Do() { string[] selectedAssets = Selection.assetGUIDs; if (selectedAssets == null || selectedAssets.Length == 0) return; foreach(string guid in selectedAssets) { UIAtlas atlas = LoadAssetByGUID<UIAtlas>(guid); CutTextures(atlas, false); } AssetDatabase.Refresh(); }其中,LoadAssetByGUID函数的实现如下:
这里我将资源类型限制为必须是Mono脚本,其实对于该函数来说不是必要的,通过实现可以看得出来,只要是继承自UnityEngine.Object类的资源都可以
/// <summary> /// 根据GUID加载资源 /// </summary> /// <typeparam name="T">要加载的资源的类型,该类型必须继承MonoBehaviour</typeparam> /// <param name="_guid">资源的GUID</param> /// <returns>返回加载的资源,如果加载失败将返回null</returns> static public T LoadAssetByGUID<T>(string _guid) where T : MonoBehaviour { string path = AssetDatabase.GUIDToAssetPath(_guid); T resum = AssetDatabase.LoadAssetAtPath(path, typeof(T)) as T; return resum; }
有了以上的实现之后,回到Unity编辑器,等到Unity将脚本更新完成,会发现菜单栏多了一条NGUI Sprite Unpacker,此时选中Project面板中的图集,依次点击菜单栏NGUI Sprite Unpacker ->Sprite Unpacker选项,然后鼠标会变成等待状态(win7系统中是个蓝色的圈一直在转),等到鼠标还原时,就说明已经解包完成了,在Project面板中AtlasTextures文件夹下会发现以图集名字命名的文件夹,里面就是对应图集的图片了。
需要注意的是,上述代码所在的脚本必须放到Editor文件夹下。
阅读全文
0 0
- NGUI 图集解包的实现
- NGUI 实现物体的双击
- NGUI的UIScrollview的实现原理
- Unity3D NGUI 2D背景图片的实现
- [NGUI]用SrollViewPanel实现相册的滚动。
- NGUI 2.6.3单选框的实现
- NGUI 实现对UISprite 的拖拽
- UGUI实现NGUI的UIEventListener功能
- 使用NGUI实现sprite的若隐若现,渐变
- Unity3d 基于NGUI的虚拟摇杆实现
- 用NGUI实现刮刮乐的效果
- NGUI简单背包系统的实现
- NGUI裁剪粒子的实现,完全仿照原有的NGUI SoftClip逻辑思路,可多层裁剪
- NGUI用于实现类似于android的Activity之间的效果
- 整理一下NGUI 的一些功能实现的代码
- NGUI 文字滚动的实现以及Grid的应用
- NGUI实现血条
- NGUI实现翻牌效果
- caffe可视化方法--配置python接口
- 一个很挫的将unordered_multimap写进共享内存的方法
- python从入门到机器学习
- stm32-W5500-官网教程
- Go数组中的索引问题
- NGUI 图集解包的实现
- 网页打开时都发生了什么?我被吓着了
- mybatis中databaseIdProvider支持多数据库配置详解
- Android开发之上下轮播
- jquery.superslider.js实现轮播图懒加载,一级jquery.lazyload.js实现图片的懒加载
- PAT甲级真题及训练集(7)--1011. World Cup Betting (20)
- Markdown基础语法速查
- SQL中使用case when 代替where
- Eclipse 操作手册