Unity3D UGUI图集打包与动态使用(TexturePacker)

 制作图集的好处:
众所周知CPU是用来处理游戏的逻辑运算的,而GPU是用来处理游戏中图像的。在GPU中,我们要绘制一个图像需要提交图片(纹理)到显存,然后再进行绘制(在这个过程中会产生一次DrawCall),也就是说我们要绘制100张图片就要产生100次DrawCall.显然这是非常消耗性能的。这是制作图集的好处就显而易见了:

①、减少性能消耗,提高处理效率
②、可以归类不同模块的图片
③、一次加载或者卸载完成多图片的处理,提高了运行效率


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

一种是使用系统自带的打包工具SpritePacker;
一种是使用外部插件TexturePacker打包图片并使用;

关于第一种方法有另一个文章为大家讲解,另一种熟悉的方法用TexturePacker工具打包,也是本文下面要讲解的本文所使用的是Unity 2018.2.5f1 (64-bit)版本,TexturePacker 5.2.0版本最新版本

1,先用TexturePacker打小图打包成我们所需要的图集,打包的格式要注意是"Unity - Texture2D sprite sheet"(有一些低版本的TP是没有这个格式的。具体使用方法可以浏览下面的网站TexturePacker Documentation


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

3,接下来需要下载并导入一个Unity3d的插件,TexturePacker自己出的的一个插件(TexturePacker Importer),插件链接Unity Asset Store - The Best Assets for Game Making,下载并成功导入之后,不用写任何代码,作任何操作,插件会自己根据.tpsheet,将刚才打包好放进入工程的大图自动裁剪成小图,如下图,打图集点开

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

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

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
public class PPTextureManager : MonoBehaviour
{private static GameObject m_pMainObject;private static PPTextureManager m_pContainer = null;public static PPTextureManager getInstance(){if(m_pContainer == null){m_pContainer = m_pMainObject.GetComponent<PPTextureManager>();}return m_pContainer;}//图集的集合private Dictionary<string, Object[]> m_pAtlasDic;private void Awake(){initData();}private void initData(){PPTextureManager.m_pMainObject = gameObject;m_pAtlasDic = new Dictionary<string, Object[]>();}//加载图集上的精灵public Sprite LoadAtlasSprite(string _spriteAtlasPath,string _spriteName){//从缓存中查找图集Sprite _sprite = FindSpriteFormBuffer(_spriteAtlasPath, _spriteName);if(_sprite == null){Debug.LogError("查找的图集为空");Object[] _atlas = Resources.LoadAll(_spriteAtlasPath);//加载图集m_pAtlasDic.Add(_spriteAtlasPath, _atlas);//将加载的图集存到字典中(路径对应图片)_sprite = SpriteFormAtlas(_atlas, _spriteName);//从图集中找到图片}return _sprite;}//从图集中找出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];}}}return null;}//从缓存中查找图集并找出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;}//删除图集缓存public void DeleteAtlas(string _spriteAtlasPath){if(m_pAtlasDic.ContainsKey(_spriteAtlasPath)){m_pAtlasDic.Remove(_spriteAtlasPath);}}
}


接下来是如何使用:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class createTexture : PPTextureManager
{private Image image;private PPTextureManager ppTextureManage;public GameObject obj;// Use this for initializationvoid Start (){obj = transform.Find("Image").gameObject;Sprite _sprite = PPTextureManager.getInstance().LoadAtlasSprite("Textures/common", "xiazai");image = obj.GetComponent<Image>();image.sprite = _sprite; }
}


这样就可以动态使用图集中的图片啦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/597013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3 + TS + vite 搭建中后台管理系统(完整项目)

vue3 TS vite 搭建中后台管理系统&#xff08;完整项目&#xff09; 前言1、搭建步骤及方法2、集成多种插件功能&#xff0c;实现中后台按需使用3、新手学TS如何快速进入状态、定义TS类型4、layout搭建四款常见风格6、大屏搭建效果5、vue3Ts运营管理系统总结&#xff1a; 前言…

three.js相机按照指定路线在建筑模型中漫游(支持开始,暂停)

three.js相机按照指定路线在模型中漫游&#xff08;支持开始&#xff0c;暂停&#xff09; 关键点 相机运动曲线 // 相机路线 const points [new THREE.Vector3(0, 40, 300),new THREE.Vector3(50, 40, 300),new THREE.Vector3(50, 40, 50),new THREE.Vector3(150, 40, 50),…

详细解读QLC SSD无效编程问题-2

作者通过SimpleSSD仿真模型&#xff0c;采用SLCQLC混合模式来开展进一步的验证工作。评估过程中&#xff0c;当写入请求到达固态硬盘时&#xff0c;首先会被写入缓存&#xff08;DRAM&#xff09;&#xff0c;然后才被回写到NAND。文中引入了一个名叫做LRU(Least Recently Used…

【Unity中的A星寻路】Navigation导航寻路系统四大页签详解

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

几种读nii图像方法的轴序比较

读 .nii / .nii.gz 图像并转成 numpy 可用 medpy.io、nibabel、itk、SimpleITK 几种方法&#xff0c;然而几种方法读出来的轴序有出入&#xff0c;本篇比较此几种方法。 Datum 所用数据来自 verse&#xff0c;经 iTomxy/data/verse/preprocess.py 预处理&#xff0c;朝向和轴…

【观察】Aginode安捷诺:坚守“长期主义”,服务中国数字经济

毫无疑问&#xff0c;随着整个社会加速数字化转型&#xff0c;尤其是5G、人工智能、大数据等技术兴起&#xff0c;以及智慧医疗、智慧金融、智能制造等应用加速落地&#xff0c;算力网络在经济社会发展中扮演了愈来愈重要的角色&#xff0c;成为支撑数字经济蓬勃发展的“新引擎…

根本记不住MySQL进阶查询语句

1 MySQL进阶查询 1.1 MySQL进阶查询的语句 全文以数据库location和Store_Info为实例 ---- SELECT ----显示表格中一个或数个字段的所有数据记录 语法&#xff1a;SELECT "字段" FROM "表名"; select 列名 from 表名 ; ---- DISTINCT ----不显示重复的数…

高清网络视频监控平台的应用-城市大交通系统视联网

目 录 一、应用需求 二、系统架构设计 三、功能介绍 1.实时视频监控 2.云台控制 3.语音功能 4. 录像管理与回放 5.告警联动 6.多种显示终端呈现 &#xff08;1&#xff09;CS客户端 &#xff08;2&#xff09;web客户端 &#xff08;3&#xf…

seo分享:慎重使用蜘蛛池

其实要提高搜索引擎蜘蛛的来访次数&#xff0c;唯一的方法还是要通过网站本身的内容更新。频繁更新有质量的内容&#xff0c;才能够提高蜘蛛的来访次数。如果本身内容更新不多&#xff0c;外部引流的蜘蛛过多&#xff0c;最终发现没什么内容索引&#xff0c;蜘蛛来访的次数也会…

【竞技宝】DOTA2:tundra宣布解散旗下阵容 whitemon留队

北京时间2024年1月4日&#xff0c;在DOTA2ESL吉隆坡站的比赛结束后&#xff0c;最近将要迎来的是BB Dacha别墅杯的预选赛&#xff0c;目前随着AR官宣新赛季阵容&#xff0c;国内一线队伍都已经全部公布了大名单。而国外还有一些队伍仍在进行人员调整&#xff0c;其中就包括前TI…

Strict MIME type checking is enforced for module scripts per HTML spec.

目录 前言错误信息如下:前言 最近使用docker打包Nginx和vue 为镜像文件,启动镜像时报错 错误信息如下: index89886.js:1 Failed to load module script: Expected a JavaScript module script but the server responded with a MIME type of "text/html". Stri…

MySQL之、CRUD、函数及union查询(实施必会)

文章目录 前言一、CRUD1.1SELECT(查询)1.2INSERT(新增)1.3UPDATE(修改)1.4DELETE(删除) 二、函数2.1常见函数2.1.1字符函数2.1.2数字函数2.1.3日期函数 2.2流程控制函数(重点)2.3聚合函数 三、union与union all思维导图&#xff1a; 前言 本篇博主给大家带来MySQL之、CRUD、常…

搜维尔科技:ART光学跟踪系统在工业VR/AR领域的应用

ART公司成立于1999年&#xff0c;拥有38万员工遍布全球&#xff0c;ART一直致力于红外线光学跟踪系统的研发与生产&#xff0c;并将先进的科技应用于产品研发&#xff0c;产品制造&#xff0c;市场营销&#xff0c;产品销售以及优秀的客户支持。主要向客户提供高端的虚拟现实跟…

MySQL Enterprise版本各系统安装包下载

一、官方下载地址 oracle下载地址 https://edelivery.oracle.com/osdc/faces/SoftwareDelivery 使用oracle账号登录进去 Category选择Download Package(下载安装包)&#xff0c;搜索栏输入mysql Enterprise关键字点search进行搜索。选项结果第一个MySQL Enterprise Edition&a…

JAVA的引用与C++的指针有什么区别

JAVA的引用与C的指针有什么区别 1. Java值类型与引用类型1.1 变量初始化1.2 变量赋值1.3 函数传参 2. Java数据存储方式2.1 Java局部变量&&Java方法参数2.2 Java数组类型引用和对象2.3 String类型数据 3. Java引用类型3.1 强引用3.2 软引用3.3 弱引用3.4 虚引用 4. JAV…

MySQL8.0安装教程

Mysql安装教程 1.Mysql下载 进入官网https://www.mysql.com/进行下载&#xff1a; 2.Mysql安装 双击文件进行安装&#xff0c;选择默认安装方式&#xff1a; 这里列出了五种安装类型&#xff1a; Developer Default&#xff1a;默认安装类型&#xff1b;Server only&#x…

在Ubuntu22.04上部署Stable Diffusion

在AI绘画软件领域Stable-Diffusion&#xff08;简称SD&#xff09;在开源领域绝对是不二之选&#xff0c;他的插件方式可以让此软件具有更多的功能&#xff0c;开发者社群为此提供了大量免费高质量的外接预训练模型&#xff08;fine-tune&#xff09;和插件&#xff0c;并持续维…

Linkage Mapper 各工具参数详解——Barrier Mapper

【小白一学就会无需其他教程】此文档用于解析使用Linkage Mapper 各输入输出参数详情以及可能的影响&#xff0c;并介绍了如何解释模型输出结果和输出参数&#xff0c;适合刚入手的人。篇幅很长很啰嗦&#xff0c;是因为每个参数都解释的万分细致。 从以下链接中获取内容&#…

Linux文件fd剖析

学习之前&#xff0c;首先要认识什么是文件&#xff1f; 空文件也是要在内存中占据空间的&#xff0c;因为它还有属性数据。文件 属性 内容文件操作 对内容 对属性 或者对内容和属性的操作标定一个文件的时候&#xff0c;必须使用&#xff1a;路径文件名&#xff0c;文件具…

交换机03_基本配置

一、思科设备的命令行基础 1、进入设备的命令行界面 设备支持命令行 去查看设备上的接口&#xff0c;是否有console口需要有console线 右击此电脑设备管理器需要通过超级终端软件进行连接&#xff0c;如putt、secret CRT、xshell等软件 &#xff08;1&#xff09;思科模拟器…