考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了
C#篇、unity通用篇、unity3D篇、unity2D篇
。
- 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的同学入门。
- 【unity通用篇】:主要讲解unity的基础通用的知识,包括unity界面、unity脚本、unity资源管理、unity动画、unity摄像机等,适合unity初学者入门。
- 【unity3D篇】:主要讲解unity3D的知识,unity3D角色、unity3D物理系统、unity3D光照等,适合只想做2D游戏的开发者学习。
- 【unity2D篇】unity2D篇:主要讲解unity2D的知识,包括unity2D角色、unity2D物理系统、unity2D光照等,适合只想做3D游戏的开发者学习。
这样方便大家按需选择性的去学习,比如有编程基础的大概率可以直接从unity通用篇开始入门,没有编程基础的建议从C#篇开始学习。只想做2D游戏的话,可以直接从unity2D篇开始学习,3D篇大概率就不需要看了,节约学习时间成本。
文章目录
前言
1、什么是SpriteAtlas?
你可以把 SpriteAtlas(精灵图集)想象成一个「智能相册」或者「百宝箱」。它能把游戏里大量零散的小图片(比如按钮、角色碎片、图标)全部打包成一张大图,让游戏运行更流畅!
2、SpriteAtlas的作用
-
减少"切换图片"的次数(Draw Call)
-
就像你整理书包:如果每本书都单独装袋,拿书时要不停拆袋,效率极低。而把书全部放进一个文件夹,一次就能拿出所有书。
-
游戏同理:打图集的主要目的就是减少DrawCall 提高性能。GPU每次切换图片都要耗费资源,合并成大图后,一次性渲染更多内容,游戏帧数更高!
-
-
节省内存空间
- 零散小图会产生大量"边角料"内存(内存碎片),就像衣柜里乱丢衣服更占空间。图集让内存排列更紧凑,利用率更高。
-
加载速度更快
- 读取1个大文件比读取100个小文件快得多!尤其对手机等设备,加载卡顿明显减少。
3、什么是Draw Call
Draw Call是Cpu向GPU发起的一种在屏幕上绘制内容的请求。问题是,准备Unity Draw Call会占用CPU大量的时间和精力。Unity必须将场景内容转换为GPU可以理解的格式。这个过程开销最昂贵的部分是设置正确的渲染参数,例如纹理,着色器,网格等。
具体过程就是:设置颜色-->绘图方式-->顶点坐标-->绘制-->结束
,所以在绘制过程中,如果能在一次DrawCall完成所有绘制就会大大提高运行效率,进而达到优化的目的。
一、在Unity中打开自带的打图集功能
可以通过在工程设置面板中选择Edit -> Project Setting -> Editor来打开Sprite Packer。
创建项目如果不是2d的,可能默认不会开启,需要自己去手动开启,选择开启Sprite Atlas V2-Enabled
就行了
二、创建图集
如果前面没有开启Unity自带的打图集功能,下面会看到提示
三、SpriteAtlas精灵图集面板参数相关
1、Type 类型
图集类型
1.1 Master 主图集
(1) Include in Build 包括在构建中
选中可以在当前构建中包含图集,就是当前图集可以包含另一个图集
(2) Allow Rotation 允许旋转
选中此选项将在打包图集时对图片元素进行旋转,可以最大限度提高组合后的图集密度。注意
:如果是UI图集,请禁用此选项,因为打包时会将场景中UI元素旋转
(3) Tight Packing 紧密包装
选中此选项在打包图集时使用图片轮廓来打包而不是根据矩形,可以最大限度提高组合后的图集密度
(4) Padding 填充
图集中各图片的间隔像素
1.2 Variant 变体类型的图集
变体图集可以理解为主图集缩放后的副本。变体图集的主要作用是以主图集为基础,对它进行缩放产生一个新的图集副本。
如果想使用变体图集中的内容,只需要勾选变体图集的Include in build选项,而主图集禁用此选项即可
(1) Master Atlas 主图集
关联的主图集(图集类型必须是Master)
(2) Include in Build 包括在构建中
选中可以在当前构建中包含图集,就是当前图集可以包含另一个图集
(3) Scale 缩放
设置变体图集的缩放因子(0~1),变体图集的大小是主图集乘以Scale的结果
2、纹理
2.1 Read/Write Enabled 读/写已启用
允许通过脚本访问纹理数据。
如果启用,会创建纹理数据的副本。会让内存翻倍,一般情况下不需要开启它
2.2 Generate Mip Maps 生成Mip贴图
勾选它会生成Mipmap;Mipmap是一种性能优化手段,用内存换性能。一般情况下不用开启。
2.3 SRGB
启用此属性可指定将纹理存储在伽马空间中。
对于非 HDR 颜色纹理(例如反照率和镜面反射颜色),应始终选中此复选框。
如果纹理存储了有特定含义的信息,并且您需要着色器中的确切值(例如,平滑度或金属度),请禁用此属性。默认情况下会启用此属性。
2.4 Filter Mode 过滤模式
纹理在3D变化拉伸时如何进行过滤
(1) Point 点
纹理靠近时变为块状
(2) Bilinear 双线性
纹理靠近时变得模糊
(3) Trilinear 三线性
与Bilinear类似,但是纹理在不同的MIP级别之间模糊
3、平台设置
3.1 Max Texture Size 最大纹理尺寸
纹理的最大尺寸,像素为单位
3.2 Format 格式
指定纹理的内部表示,在不同平台上会有不同的参数
3.3 Compression 压缩
纹理压缩类型。量越高占用内存越多,不压缩质量最好
3.4 Use Crunch Compression 使用Crunch 压缩
使用Crunch压缩,是一种有损压缩格式,压缩耗时长,但是运行时解压速度快
- Compressor Quality 压缩器质量:压缩质量,质量越高纹理越大,耗时越长
4、Objects for Packing 包装对象
关联需要打图集的图片们,点击加号添加图集中的小图。注意:一定是Sprite类型的图片。
一张一张加很麻烦的话,可以直接拖拽图片或者文件夹
进窗口,会自动把文件夹下Sprite类型的图片加到图集中。
5、Pack Preview 打包预览
四、验证打包成功
我们可以通过观察DrawCall数量验证是否打包成功
1、如何查看Draw Call数量
方法一
可以通过分析器查看Draw Call数量
方法二
观察Stats状态下的Batches批处理数量。假如为1就说明只进行了一次DrawCall。
2、验证是否打包成功
我们先运行默认场景,观察Stats状态下的Batches批处理数量。
将我们要使用的图片全部进行打包。
随便拖多5个图片到场景上去后运行。观察Stats状态下的Batches批处理数量。
你可以看到Batches从原来的23个变成了现在的28个。很明显打包没有生效,按理说Batches应该是24才对,那为什么还是没有效果呢?
其实我们还需要给给每个图片对象,绑定一个相同的材质球才行(unity不会把默认的材质按一样的材质进行计算
)。随便新增一个材质球,绑定上去。
重新运行看看效果。发现Batches数量降为了25,那么打图集就成功了。(ps:多出来的1个是材质球还需要一次Batches
)
注意:Unity是运行后才会检测图片是不是在一个图集中,再减少Batches批处理数量(虽然unity6貌似不运行也可以,但我还是推荐运行后观察Batches数量,更加准确)
五、代码获得SpriteAtlas精灵图集并加载图集中的图片
SpriteAtlas类要引用UnityEngine.U2D
命名空间
// 创建一个新的GameObject对象
GameObject gameObject = new GameObject();
// 为GameObject对象添加一个SpriteRenderer组件
SpriteRenderer spriteRenderer = gameObject.AddComponent<SpriteRenderer>();
// 加载名为"MyAtlas"的SpriteAtlas资源
SpriteAtlas spriteAtlas = Resources.Load<SpriteAtlas>("MyAtlas");
//SpriteAtlas中的GetSprite方法 获得图集中的图
//克隆此图集中与打包的名称匹配的第一个 Sprite 并将其返回。
// 从图集中获取名为"dead1"的小图
spriteRenderer.sprite = spriteAtlas.GetSprite("dead1");
常见问题
1、准备打包的精灵图片要使用未压缩的格式
打包时注意查看编辑器警告,如果弹出类似这种警告:Source Texture (Assets/Circle.png) of Sprite (Circle) is using compressed format. To ensure no loss in source pixel details when packing to SpriteAtlas, please use uncompressed format in TextureImporter.
要打包的精灵图片正在使用压缩格式。为了确保打包到SpriteAtlas时不会丢失源像素细节,请在TextureImporter中使用未压缩的格式。
2、要真正减少Draw Call次数,游戏对象我们需要使用相同的材质球
正如前面所说,我们需要给每个图片游戏对象,绑定一个相同的材质球才行(unity不会把默认的材质按一样的材质进行计算
)。
专栏推荐
地址 |
---|
【零基础入门unity游戏开发——C#篇】 |
【零基础入门unity游戏开发——unity通用篇】 |
【零基础入门unity游戏开发——unity3D篇】 |
【零基础入门unity游戏开发——unity2D篇】 |
【制作100个Unity游戏】 |
【推荐100个unity插件】 |
【实现100个unity特效】 |
【unity框架/工具集开发】 |
完结
好了,我是向宇
,博客地址:https://xiangyu.blog.csdn.net,如果学习过程中遇到任何问题,也欢迎你评论私信找我。
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!