16.2D相关-Sprite-SpriteAtlas精灵图集
16.1 知识点
为什么要打图集
- 打图集的目的就是减少DrawCall 提高性能
- 具体DrawCall是什么在NGUI课程中已经详细讲解
- 在2D游戏开发,以及UI开发中是会频繁使用的功能
- 所以一定要先去看了DrawCall相关的知识再继续往下看
在Unity中打开自带的打图集功能
可以通过在工程设置面板中选择Edit -> Project Setting -> Editor来打开Sprite Packer。
- Disabled:默认设置,不会打包图集。假如创建不是2D项目可能就是这个选项。
- Enabled For Builds(Legacy Sprite Packer):Unity仅在构建时打包图集,在编辑模式下不会打包图集。
- Always Enabled(Legacy Sprite Packer):Unity在构建时打包图集,在编辑模式下运行前会打包图集。
- Legacy Sprite Packer传统打包模式相对于下面两种模式来说,多了一个设置图片之间的Padding Power间隔距离。Padding Power选项用于选择打包算法在计算打包的精灵之间以及精灵与生成的图集边缘之间的间隔距离。这里的数字代表2的n次方。
- Enabled For Build:Unity仅在构建时打包图集,在编辑器模式下不会打包。
- Always Enabled:Unity在构建时打包图集,在编辑模式下运行前会打包图集。
SpriteAtlas精灵图集面板参数相关
创建图集
Type 类型
- 图集类型
Master 主图集
Include in Build 包括在构建中
- 选中可以在当前构建中包含图集,就是当前图集可以包含另一个图集
Allow Rotation 允许旋转
- 选中此选项将在打包图集时对图片元素进行旋转,可以最大限度提高组合后的图集密度。注意:如果是UI图集,请禁用此选项,因为打包时会将场景中UI元素旋转
Tight Packing 紧密包装
- 选中此选项在打包图集时使用图片轮廓来打包而不是根据矩形,可以最大限度提高组合后的图集密度
Padding 填充
- 图集中各图片的间隔像素
Variant 变体类型的图集
- 变体图集可以理解为主图集缩放后的副本
- 变体图集的主要作用是以主图集为基础,对它进行缩放产生一个新的图集副本。如果想使用变体图集中的内容,只需要勾选变体图集的Include in build选项,而主图集禁用此选项即可
Master Atlas 主图集:关联的主图集(图集类型必须是Master)
Include in Build 包括在构建中
- 选中可以在当前构建中包含图集,就是当前图集可以包含另一个图集
Scale 缩放
- 设置变体图集的缩放因子(0~1),变体图集的大小是主图集乘以Scale的结果
Read/Write Enabled 读/写已启用
- 允许通过脚本访问纹理数据。
- 如果启用,会创建纹理数据的副本。会让内存翻倍,一般情况下不需要开启它
Generate Mip Maps 生成Mip 贴图
- 勾选它会生成Mipmap;Mipmap是一种性能优化手段,用内存换性能。
- 一般情况下不用开启
SRGB
- 启用此属性可指定将纹理存储在伽马空间中。
- 对于非 HDR 颜色纹理(例如反照率和镜面反射颜色),应始终选中此复选框。
- 如果纹理存储了有特定含义的信息,并且您需要着色器中的确切值(例如,平滑度或金属度),请禁用此属性。
- 默认情况下会启用此属性。
Filter Mode 过滤模式
- 纹理在3D变化拉伸时如何进行过滤
Point 点
- 纹理靠近时变为块状
Bilinear 双线性
- 纹理靠近时变得模糊
Trilinear 三线性
- 与Bilinear类似,但是纹理在不同的MIP级别之间模糊
Objects for Packing 包装对象
- 关联需要打图集的图片们
- 点击加号添加图集中的小图
- 注意:一定是Sprite类型的图片。
- 一张一张加很麻烦的话,可以直接拖拽图片或者文件夹进窗口,会自动把文件夹下Sprite类型的图片加到图集中
Pack Preview 打包预览
- 注意要在Unity中打开自带的打图集功能
- 点击打成图集
Default 默认
Max Texture Size 最大纹理尺寸
- 纹理的最大尺寸,像素为单位
Format 格式
- 指定纹理的内部表示,在不同平台上会有不同的参数
Compression 压缩
- 纹理压缩类型
- 质量越高占用内存越多,不压缩质量最好
不压缩
低质量
普通质量
高质量
Use Crunch Compression 使用Crunch 压缩
- 使用Crunch压缩,是一种有损压缩格式,压缩耗时长,但是运行时解压速度快
Compressor Quality 压缩器质量
- 压缩质量,质量越高纹理越大,耗时越长
观察DrawCall数量
把图集中的图片拖多几个到场景上去后运行。观察Stats状态下的Batches批处理数量。假如为1就说明只进行了一次DrawCall,那么打图集就成功了。
把同一图集下其他图片多丢几个上去。运行后Stats状态下的Batches批处理数量也会变成1
注意:Unity是运行后才会检测图片是不是在一个图集中再减少Batches批处理数量
代码获得SpriteAtlas精灵图集并加载图集中的图片
SpriteAtlas.GetSprite方法 获得图集中的图
// 创建一个新的GameObject对象
GameObject gameObject = new GameObject();
// 为GameObject对象添加一个SpriteRenderer组件
SpriteRenderer spriteRenderer = gameObject.AddComponent<SpriteRenderer>();
// SpriteAtlas类要引用UnityEngine.U2D命名空间
// 加载名为"MyAtlas"的SpriteAtlas资源
SpriteAtlas spriteAtlas = Resources.Load<SpriteAtlas>("MyAtlas");
//SpriteAtlas中的GetSprite方法 获得图集中的图
//克隆此图集中与打包的名称匹配的第一个 Sprite 并将其返回。
// 从图集中获取名为"dead1"的小图
spriteRenderer.sprite = spriteAtlas.GetSprite("dead1");
16.2 知识点代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.U2D;
public class Lesson16_2D相关_Sprite_SpriteAtlas精灵图集 : MonoBehaviour
{
void Start()
{
#region 知识点一 为什么要打图集
//打图集的目的就是减少DrawCall 提高性能
//具体DrawCall是什么在NGUI课程中已经详细讲解
//该节课是免费课 即使没有购买 也可以前往观看
//在2D游戏开发,以及UI开发中是会频繁使用的功能
//所以大家一定要先去看了DrawCall相关的知识再继续往下看
#endregion
#region 知识点二 在Unity中打开自带的打图集功能
//在工程设置面板中打开功能
//Edit——>Project Setting——>Editor
//Sprite Packer(精灵包装器,可以通过Unity自带图集工具生成图集)
//Disabled:默认设置,不会打包图集
//Enabled For Builds(Legacy Sprite Packer):Unity仅在构建时打包图集,在编辑模式下不会打包图集
//Always Enabled(Legacy Sprite Packer):Unity在构建时打包图集,在编辑模式下运行前会打包图集
//Legacy Sprite Packer传统打包模式 相对下面两种模式来说 多了一个设置图片之间的间隔距离
//Padding Power:选择打包算法在计算打包的精灵之间以及精灵与生成的图集边缘之间的间隔距离
// 这里的数字 代表2的n次方
//Enabled For Build:Unity进在构建时打包图集,在编辑器模式下不会打包
//Always Enabled:Unity在构建时打包图集,在编辑模式下运行前会打包图集
#endregion
#region 知识点三 SpriteAtlas精灵图集面板参数相关
#endregion
#region 知识点四 观察DrawCall数量
#endregion
#region 知识点五 代码获得SpriteAtlas精灵图集并加载图集中的图片
// 创建一个新的GameObject对象
GameObject gameObject = new GameObject();
// 为GameObject对象添加一个SpriteRenderer组件
SpriteRenderer spriteRenderer = gameObject.AddComponent<SpriteRenderer>();
// SpriteAtlas类要引用UnityEngine.U2D命名空间
// 加载名为"MyAtlas"的SpriteAtlas资源
SpriteAtlas spriteAtlas = Resources.Load<SpriteAtlas>("MyAtlas");
//SpriteAtlas中的GetSprite方法 获得图集中的图
//克隆此图集中与打包的名称匹配的第一个 Sprite 并将其返回。
// 从图集中获取名为"dead1"的小图
spriteRenderer.sprite = spriteAtlas.GetSprite("dead1");
#endregion
}
}
16.3 练习题
练习题内容
16.4 练习题代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.U2D;
public class Lesson16_练习题 : MonoBehaviour
{
void Start()
{
#region 练习题一
//将我提供给大家的资源制作成图集,并且通过代码加载图集中的一张图片来使用
GameObject gameObject = new GameObject();
SpriteRenderer spriteRenderer = gameObject.AddComponent<SpriteRenderer>();
SpriteAtlas spriteAtlas = Resources.Load<SpriteAtlas>("PigAtlas");
spriteRenderer.sprite = spriteAtlas.GetSprite("hit0");
#endregion
#region 练习题二
//在场景中有3张图片,3张图片叠在一起放,最底层和最上层的图片在一个图集中,
//中间的图片和他们两不在一个图集中,请告诉我当前的DrawCall数量是多少?
//三次。中间的不在同一图集会占用DrawCall。不同图集的穿插会打断DrawCall的批处理。
#endregion
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com