TexturePacker

在用UGUI时,我们需要将一个个小图打包成图集,然后将图集一次性加载以内存换取图片读取效率,即减小Drawcall。

UGUI打包并使用图集有两种方法:一种是使用系统自带的打包工具SpritePacker,这种方法限制比较多;一种是使用TexturePacker打包图片并使用。

  1. 先打开TexturePacker把小图打包成我们所需要的图集,打包的格式要注意是"Unity - Texture2D sprite sheet"

打包之后会有一个.png和一个.tpsheet,直接将这两个文件放在工程资源中即可,此时从工程看这只是一张大图,并不能算是一个图集。虽然可以用Unity自带的图片裁剪的功能,但裁剪的小图大小基本不对。

  1. 接下来需要下载并导入一个Unity的插件,在Asset Story搜索TexturePacker Importer并导入,不用进行任何操作,插件会自己根据.tpsheet将刚才打包好放进入工程的大图自动裁剪成小图,点开图集如下:


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

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

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

using UnityEngine;
using System.Collections;
using System.Collections.Generic;  //纹理图集加载管理
public class PPTextureManage : MonoBehaviour {  private static GameObject m_pMainObject; //挂载对象private Dictionary<string, Object[]> m_pAtlasDic; //图集的集合,Dictionary<[key], [value]>,方便处理 private static PPTextureManage m_pContainer = null; //单例public static PPTextureManage getInstance(){  if(m_pContainer == null){  m_pContainer = m_pMainObject.GetComponent<PPTextureManage> ();  }  return m_pContainer;  }  void Awake (){  initData ();  }void Start () {  }    private void initData(){  //一些初始化操作PPTextureManage.m_pMainObject = gameObject;  m_pAtlasDic = new Dictionary<string, Object[]> ();  }  //删除图集缓存  public void DeleteAtlas(string _spriteAtlasPath){  //字典的键为路径if (m_pAtlasDic.ContainsKey (_spriteAtlasPath)) {  //ContainsKey为Dictionary的方法,判断是否存在指定键名,不可以使用get来判断是否存在某个键,因为当键存在,值不存在,也返回nullm_pAtlasDic.Remove (_spriteAtlasPath);  //Remove为Dictionary方法,移除键值}  } //加载图集上的一个精灵  public Sprite LoadAtlasSprite(string _spriteAtlasPath,string _spriteName){  //第一个参数为图集路径,第二个参数为精灵图名Sprite _sprite = FindSpriteFormBuffer (_spriteAtlasPath,_spriteName);  //FindSpriteFormBuffer,先从缓存中查找spriteif (_sprite == null) {  //当_sprite找不到,说明m_pAtlasDic的Object[]为空,还未缓存Object[]Object[] _atlas = Resources.LoadAll (_spriteAtlasPath);  m_pAtlasDic.Add (_spriteAtlasPath,_atlas);  _sprite = SpriteFormAtlas (_atlas,_spriteName);  //SpriteFormAtlas,直接从图集本身查找}  return _sprite;  }  //从缓存中查找图集,并找出sprite  private Sprite FindSpriteFormBuffer(string _spriteAtlasPath,string _spriteName){  //第一个参数为图集路径,第二个参数为精灵图名if (m_pAtlasDic.ContainsKey (_spriteAtlasPath)) {  //如果键名存在Object[] _atlas = m_pAtlasDic[_spriteAtlasPath]; //把m_pAtlasDic值保存起来,即图集数组 Sprite _sprite = SpriteFormAtlas(_atlas,_spriteName);  //在m_pAtlasDic值中寻找return _sprite;  }  return null;  }  //从图集中,并找出sprite  private 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+";在图集中找不到");  //如果没有returnreturn null;  }
}
  1. 代码使用示例
Sprite _sprite = PPTextureManage.getInstance().LoadAtlasSprite("common/game/CommPackAltas","小图名字");

原文:https://blog.csdn.net/weixin_39706943/article/details/80522010

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

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

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

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

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

  3. Unity UGUI图集专题

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

  4. UGUI 图集打包工具Sprite Packer

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

  5. 使用Unity UGUI根据实时数据动态绘制图线(心电图)

    [通知]本文的新升级版发布于 https://blog.csdn.net/xxxhhhyxy/article/details/117389897,并且已有新的工程包可供下载,请诸位移架观看. 同志们想 ...

  6. Unity竖屏打包,动态切换为横屏

    问题描述 由于我们主应用是竖屏应用,打包的旋转方式只能是Portrait: 而某些功能模块需要横屏展示,这个时候就需要动态切换为横屏,退出该模块之后在切回竖屏: 其实旋转相机可以做到,但适配UI时候会 ...

  7. Unity一键图集生成工具,附源码 (基于NGUI和TexturePacker)

    https://blog.uwa4d.com/archives/NGUI_SplitChannels.html Unity一键图集生成工具,附源码 (基于NGUI和TexturePacker) 作者: ...

  8. Unity 将Sprite打包进图集

    前言: 打包图集是一个很简单的过程,但是如果没有这样的经验,可能不知道如何下手 本博客大概说一下打包流程,以及一些基本原理 1.为什么要打包图集 首先要了解一点,在UGUI中即使你什么都不干,在项目打 ...

  9. 【游戏开发实战】Unity UGUI Text图文混排(聊天文字混表情),支持动态表情,出招吧表情帝

    文章目录 一.前言 二.最终效果 三.具体使用 1.导入表情素材 2.设置图片格式 3.生成表情图集 4.UI-EmojiFont.shader 5.材质球 四.测试 五.结束语 一.前言 点关注不迷 ...

最新文章

  1. python中可用于布尔测试的,如何在Python中使用布尔值?
  2. Linux : 文件处理命令
  3. element-ui 源码学习
  4. Google 对战微软阿里,AIoT 进入“战国时代”!
  5. Vivado2018的使用
  6. iOS16 beta8 描述文件官方地址下载
  7. 《周易》中的君子形象--http://cul.china.com.cn/guoxue/2018-06/04/content_40369049.htm
  8. win10卸载软件通过控制面板
  9. 2010世界财富排行榜
  10. Java微信公众号高级 微信墙,JAVA折腾微信公众平台(Token验证)
  11. error LNK2019 ,error LNK2001:无法解析的外部符号,LINK : fatal error LNK1104: 无法打开文件
  12. win10设置默认浏览器
  13. 微盟“删库”144小时:痛的不是股价,是信任
  14. springboot+rocketmq(5):实现批量消息
  15. 透过Python 将接收邮件邮件进行分类统计
  16. 机器人:打开潘多拉魔盒
  17. 传奇 android单机游戏,安卓大型传奇单机游戏
  18. DBCP连接池常用参数详解
  19. 高频电路相关知识(四)
  20. oxooooooof4蓝屏_常见电脑蓝屏代码分析与解决方法解析大全

热门文章

  1. 【搜索与回溯算法】保卫农场(DFS)
  2. 爬虫:python爬取简历模板
  3. android获得键盘高度,Android获取软键盘高度
  4. 软考高项论文写作注意要点(一)
  5. 广东高中生多少人_2020年广东高考报名人数统计有多少人
  6. Ubuntu搭建Http服务器用于下载Ubuntu文件
  7. 龙芯mips64el 微信客户端 ubuntu 微信客户端
  8. ckeditor+vue 傻瓜式操作教程
  9. PEEL——深度隐写信息去除攻击——PEEL: A Provable Removal Attack on Deep Hiding
  10. 华盛顿大学计算机专业硕士申请,华盛顿大学计算机科学与系统理学硕士研究生申请要求及申请材料要求清单...