前言

在用UGUI时,我们也需要将一个个小图打包成图集,以减小Drawcall(类似coco2d-x一样,打包成图集一次性加载以内存换取图片读取效率),UGUI打包并使用图集有两种方法:一种是使用系统自带的打包工具SpritePacker;一种是使用TexturePacker打包图片并使用;

关于第一种方法可以参见另一文章,里面有详细的解释与示例使用(文章链接:http://www.xuanyusong.com/archives/3304),这种方法限制比较多,转而用另一种熟悉的方法用TexturePacker工具打包,也是本文下面要讲解的

正文

本文所使用的是Unity3d 5.4版本,TexturePacker 4.2.3版本

1,先用TexturePacker打小图打包成我们所需要的图集,打包的格式要注意是"Unity - Texture2D sprite sheet"(有一些低版本的TP是没有这个格式的),

打包之后会有一个.png和一个.tpsheet,不用作其他修改,将这两个文件放在工程资源中,这时从工程看这只是一张大图,并不能算是一个图集,使用里面的小图(这时虽然可以用unity3d自带功能,手动对图片进行裁剪,但裁剪的小图大小基本是不对的)

2,接下来需要下载并导入一个Unity3d的插件,TexturePacker自己出的的一个插件(TexturePacker Importer),插件链接https://www.assetstore.unity3d.com/en/#!/content/16641,下载并成功导入之后,不用写任何代码,作任何操作,插件会自己根据.tpsheet,将刚才打包好放进入工程的大图自动裁剪成小图,如下图,打图集点开

我们只需像使用单独小图一样,将图集里的小图拖进Source Image里即可。这时我们还只能在编辑器里设置使用图集。

3,我们还需要在程序中 动态加载图集并使用图集里的小图,才算是完整的。unity3d 并没有明确api说明我们如何用这种图集,而常用Resources.Load()加载只能返回单独的一个图片纹理,所以我们用另一个方法 Resources.LoadAll();加载整一张图集,此方法会返回一个Object[],里面包含了图集的纹理 Texture2D和图集下的全部Sprite,所以我们就可以根据object 的类型和名字找到我们需要的某张小图片。

4.下面写了一个图集纹理的管理类,去统一管理加载,是一个单例类,找个不被销毁的GameObject绑定就行, 代码比较简单,用一个Dictionary按图集的路径过key将加载过的图集缓存起来,需要时再由外部删除掉,下面是代码

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
//纹理图集加载管理
public class PPTextureManage : MonoBehaviour {private static GameObject m_pMainObject;private static PPTextureManage m_pContainer = null;public static PPTextureManage getInstance(){if(m_pContainer == null){m_pContainer = m_pMainObject.GetComponent<PPTextureManage> ();}return m_pContainer;}private Dictionary<string, Object[]> m_pAtlasDic;//图集的集合void Awake(){initData ();}private void initData(){PPTextureManage.m_pMainObject = gameObject;m_pAtlasDic = new Dictionary<string, Object[]> ();}// Use this for initializationvoid Start () {}//加载图集上的一个精灵public Sprite LoadAtlasSprite(string _spriteAtlasPath,string _spriteName){Sprite _sprite = FindSpriteFormBuffer (_spriteAtlasPath,_spriteName);if (_sprite == null) {Object[] _atlas = Resources.LoadAll (_spriteAtlasPath);m_pAtlasDic.Add (_spriteAtlasPath,_atlas);_sprite = SpriteFormAtlas (_atlas,_spriteName);}return _sprite;}//删除图集缓存public void DeleteAtlas(string _spriteAtlasPath){if (m_pAtlasDic.ContainsKey (_spriteAtlasPath)) {m_pAtlasDic.Remove (_spriteAtlasPath);}}//从缓存中查找图集,并找出spriteprivate Sprite FindSpriteFormBuffer(string _spriteAtlasPath,string _spriteName){if (m_pAtlasDic.ContainsKey (_spriteAtlasPath)) {Object[] _atlas = m_pAtlasDic[_spriteAtlasPath];Sprite _sprite = SpriteFormAtlas(_atlas,_spriteName);return _sprite;}return null;}//从图集中,并找出spriteprivate Sprite SpriteFormAtlas(Object[] _atlas,string _spriteName){for (int i = 0; i < _atlas.Length; i++) {if (_atlas [i].GetType () == typeof(UnityEngine.Sprite)) {if(_atlas [i].name == _spriteName){return (Sprite)_atlas [i];}}}Debug.LogWarning ("图片名:"+_spriteName+";在图集中找不到");return null;}
}

5,代码使用示例

 Sprite _sprite = PPTextureManage.getInstance().LoadAtlasSprite("common/game/CommPackAltas","小图名字");

本文转载自:https://blog.csdn.net/cjsen/article/details/52487706

Unity3d之UGUI图集打包与动态使用(TexturePacker)相关推荐

  1. Unity UGUI图集打包与动态使用(TexturePacker)

    TexturePacker 在用UGUI时,我们需要将一个个小图打包成图集,然后将图集一次性加载以内存换取图片读取效率,即减小Drawcall. UGUI打包并使用图集有两种方法:一种是使用系统自带的 ...

  2. Unity打包AssetBundle自动分析资源依赖关系(包括UGUI图集打包)

    https://blog.csdn.net/u012740992/article/details/79371986 怎么分析资源的依赖关系呢,并设置AssetBundleName呢? 我们检测资源之间 ...

  3. UGUI 图集打包工具Sprite Packer

    一.设计的目的:让开发者忘记图集的概念,使用小图去开发UI,unity自动会将这些小图按照tag名字打到图集里面去. 二.启用的方式:在Edit->Project Settings->Ed ...

  4. Unity UGUI图集专题

    一:图集介绍 什么是图集:我们可以将其理解为将一系列小图合并为一张大图.使用图集可以减少drawcall,提升效率. ​ 游戏中的图片模型最终是要给到显卡去渲染的,然后CPU通知GPU要开始渲染,这一 ...

  5. 图集打包算法_UGUI打包图集工具-插件Simple Sprite Packer详解

    做过NGUI或者Unity2D[更熟悉]游戏的的人,应该记得,比如要做一个角色的动画,美术给的一张大图[里面包含很多的小图,是角色的各个部位].这张大图就可以理解为一张图集! NGUI也是类似. 那么 ...

  6. maven 打包时动态替换properties资源文件中的配置值

    pom build节点下面添加resource配置: [html] view plaincopy <resources> <resource> <directory> ...

  7. Unity3d中UGUI组件精简复盘(十八)Aspect Ratio Fitter组件

    上一节,我们简单概括了Unity3D编辑器中三大 Layout Group组件的简要介绍.具体详情链接为:Unity3d中UGUI组件精简复盘(十七)LayoutElement 话不多说,我们直接进入 ...

  8. Unity3d中UGUI组件精简复盘(十九)ContentSizeFitter组件

    上一节,我们简单概括了Unity3D编辑器中 Aspect Ratio Fitte组件的简要介绍.具体详情链接为:Unity3d中UGUI组件精简复盘(十八)Aspect Ratio Fitter 话 ...

  9. Vue-cli3项目seo优化--静态化打包(动态改变页面Titl、keyWords、description)

    Vue-cli3项目seo优化,静态化打包(动态改变页面Titl.keyWords.description) 文章目录 Vue-cli3项目seo优化,静态化打包(动态改变页面Titl.keyWord ...

最新文章

  1. 【MFC】在CHtmlView中准确判断页面加载完成
  2. @Autowired静态变量
  3. 如何恢复默认域策略和默认域控制器策略
  4. php 输出答案,php 如何只输出最后生成的那个值??
  5. Java黑皮书课后题第10章:*10.22(实现String类)Java库中提供了String类,给出你自己对下面方法的实现(将新类命名为MyString1)
  6. 什么是 MIME Type
  7. plotly django_使用Plotly为Django HTML页面进行漂亮的可视化
  8. [转载]项目风险管理七种武器-离别钩
  9. Android集成一个新产品时,lunch的product name和device name注意事项
  10. Verilog代码实例化的简单理解(以38译码器为例)
  11. C++/测绘附和导线测量源码
  12. # 研究杂感 × DEA-Malmquist
  13. 10的n次方 java_为大家一共一个10的n次方的算法
  14. 欧几里得算法证明,最小公倍数求法证明
  15. 【小白笔记】EAST:Learning Policies for Adaptive Tracking with Deep Feature Cascades
  16. CSP 201609-3 炉石传说
  17. 前端培训-javascript 的垃圾回收机制
  18. appium重启报错:Could not proxy command to the remote server. Original error: socket hang up
  19. 杂谈:区块链是否值得投资
  20. 项目总结(css3中的阴影效果)

热门文章

  1. 智慧党建云平台v4.0.5
  2. 企业年报申报的注意事项
  3. 无法获取下列许可solidworks standard解决方法
  4. 2019.10 全世界评分最高动画TOP100
  5. 虚拟机安装XP怎么更容易进入BIOS
  6. vue实现前台生成word并下载,并且可实现批量打包下载
  7. win10系统ie直接跳转edge还原方法
  8. 蓝桥杯单片机第13届省赛程序设计题
  9. 服务器导出表格无法打开php,phpSpreadsheet导出xlsx无法打开的解决办法
  10. 2013年暑假日记(数学建模)