5 2D
约 3736 字大约 12 分钟
2025-06-01
MipMap 在三维计算机图形的贴图渲染中有一个常用的技术被称为Mipmapping。 为了加快染速度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件这样的贴图被称为mipmap Mipmap需要占用一定的内存空间 Mipmap中每一个层级的小图都是主图的一个特定比例的缩小细节的复制品 虽然在某些必要的视角,主图仍然会被使用,来演染完整的细节。 但是当贴图被缩小或者只需要从远距离观看时,mipmap就会转换到适当的层级 因为mipmap贴图需要被读取的像素远少于普通贴图,所以渲染的速度得到了提升。 而且操作的时间减少了,因为mipmap的图片已经是做过抗锯齿处理的,从而减少了实时演染的负担 放大和缩小也因为mipmap而变得更有效率。 如果贴图的基本尺寸是256x256像素的话,它mipmap就会有8个层级。 每个层级是上一层级的四分之一的大小 依次层级大小就是:128×128;64×64;32×32;16×16;8x8;4×4;2×2;1×1(1个像素)
开启MipMap功能后,Unity会帮助我们根据图片信息生成n张不同分辨率的图片 在场景中会根据我们离该模型的距离选择合适尺寸的图片用于演染,提升演染效率
sprite
要使用精灵图需要引入2d的包,如果是2d项目unity引擎会自动引入2d包,如果是3d项目就需要手动引入
Sprite Editor
Single
- Sprite Editor基础图片设置(右下角窗口)主要用于设置单张图片的基础属性
- Custom Outline(决定渲染区域)自定义边缘线设置,可以自定义精灵网格的轮廓形状默认情况下不修改都是在矩形网格上染,边缘外部透明区域会被渲染,浪费性能,使用自定义轮廓,可以调小透明区域,提高性能
- Custom Physics Shape (决定碰撞判断区域)自定义精灵图片的物理形状,主要用于设置需要物理碰撞判断的2D图形它决定了之后产生碰撞检测的区域
- Secondary Textures(为图片添加特殊效果)次要纹理设置,可以将其它纹理和该精灵图片关联着色器可以得到这些辅助纹理然后用于做一些效果处理让精灵应用其它效果
Multiple图集元素
当我们的图片资源是图集时 我们需要在设置时将模式设置为Multiple 这时我们可以使用spriteEditor自带的功能进行图集元素分割
Polygon
如果我们使用的资源时多边形资源 我们可以在设置时将模式设置为Polygon 然后可以在spriteEditor中进行快捷设置
但是一般这种模式在实际开发中使用较少
Sprite Render
Sprite Renderer是精灵渲染器 所有2D游戏中游戏资源(除uI外)都是通过Sprite Renderer让我们看到的 它是2D游戏开发中的一个极为重要的组件
Sprite:渲染的精灵图片 Color:定义着色,一般没有特殊需求不会修改 Filp:水平或竖直翻转精灵图片 Draw Mode:绘制模式,当尺寸变化时的缩放方式 MaskInteraction:与精灵遮罩交互时的方式 SpriteSortPoint:计算摄像机和精灵之间距离时,使用精灵中心 Center还是轴心点Pivot,一般情况下不用修改 Material:材质,可以使用一些自定义材质来显示一些特殊效果一般情况不修改。默认材质是不会受到光照影响的,如果想要受光照影响,可以选择Default-Diffuse AdditionalSettings:高级设置 SortingLayer:排序层选择 OrderinLayer:层级序列号,数值越大约会显示在前面
代码设置
函数 | 作用 |
---|---|
Resources.Load<Sprite> | 加载精灵图 |
Resources.LoadAll<Sprite> | 加载图集,返回的数组是图集中切片出的所有图,通过索引获取某个图 |
Sprite Mask
精灵图遮罩,可以设置图片的属性让显示在遮罩的外部或内部
自定义遮罩范围中图片的层级要在小于font并且大于back才可以显示出来
SortingGroup
SortingGroup是排序分组的意思 它的主要作用就是对多个精灵图片进行分组排序 Unity会将同一个排序组中的精灵图片一起排序,就好像他们是单个游戏对象一样 主要作用是对于需要分层的2D游戏用于整体排序
常在一个空对象上添加SortingGroup组件,用于分层显示 SortingGroup只有两个属性用于配置层级
SpriteAtlas
制作图集的目的就是减少DrawCall提高性能
制作图集:将许多小图制作成一张大图
打包图集后,直接去原文件夹找小图将其放到场景里也可以被自动识别为一个图集的
DrawCall
DrawCa11就是绘制呼叫的意思表示CPU通知GPU(图形级处理器-显卡)
DrawCall 概念 就是cPu(处理器)准备好渲染数据(顶点,纹理,法线,Shader等等)后 告知GPUI图形处理器-显卡)开始渲染(将命令放入命令缓冲区)的命令
简单来说:一次DrawCall就是CPU准备好染数据通知GPU渲染的这个过程
如果游戏中DrawCall数量较高会影响cPu的效率 最直接的感受就是游戏会卡顿!
渲染过程和上面的例子很类似,每次DrawCa11,CPU都需要准备很多数据发送给GPU 那么如果DrawCal1越多那么额外开销就越大,其实GPu的染效率是很强大的,往往影响染效率的都是因为CPU提交命令的速度 如果DrawCal1太多cPU就会把大量时间画在提交DrawCa1l上造成cPu过载,游戏卡顿
在UI层面上的优化 小图合大图>即多个小DrawCall变一次大DrawCal1
不同图集所在层级对DrawCall的影响 如果一个画面中只使用了一个图集的若干个子图。那么它们的DrawCall次数是大图的一次 如果在画面中新添加了另一个图集的子图,假设当前画面中第一个图集的两个子图层级分别是1,2,新增图集子图的层级是3。那么DrawCall次数就是2,即两个图集的DrawCall 如果第一个图集两个子图的层级分别是1,3,而新增图集子图的层级是2,那么DrawCall的次数是3。 多个图集的层级关系会影响到DrawCall的次数,因此在绘制画面是应尽量使同一图集的子图在层级上是连续的
label中动态字体会单独打一个图集
Spriteshape
Sprite Shap Profile精灵形状概述文件
主要是方便我们以节约美术资源为前提 制作2D游戏场景地形或者背景的
- UseSpriteBorders:是否使用精灵边框,用于九宫格拉伸
- Texture:用于填充实心部分的纹理(使用的纹理的平铺模式必须是
- Repeat重复模式)
- Offset:纹理偏移量这里的设置主要用于封闭图形在不同角度范围内使用的图片不同可以达到一个封闭效果
- AngleRanges:角度范围
- Start:起始角度
- End:结束角度
- Order:Sprite相交时的优先级,优先级高的显示在前面
- Sprites:指定角度范围内的精灵列表在该角度范围内,可以选择使用的图片资源
- Cormers:指点角显示的精灵图片主要用于封闭图形 外部四个角用的图片内部四个角用的图片
2d刚体
2D物理系统中的刚体和3D中的刚体基本是一样的 最大的区别是对象只会在xY平面中移动,并且只在垂直于该平面的轴上旋转
在2d刚体中也拥有物理材质选项 同时2d碰撞器中也拥有物理材质 应用顺序:
- 2D碰撞器上指定的2D物理材质
- 2D刚体上指定的2D物理材质
- Physics2D窗口指定的2D默认物理材质
碰撞器
边界碰撞器
2d中大多数碰撞器和3d类似,在2d中边界碰撞器是一个线段,可以自定义边界
复合碰撞器
复合碰撞器是将一个物体和它子物体一起生成一个碰撞器取代它们原本的碰撞器(原本的碰撞器可能重合等引起不必要的计算)
效应器
区域效应器
在一个区域施加一个力场,在这里力场中的物理都会收到力的作用
要创建效应器要先有一个物体,并给这个物体添加碰撞器,在碰撞器的属性中将触发和用于效应器选项打开后再添加效应器组件 如果不更改选项就会被当成碰撞的物体
浮力效应器
- Density:流体密度,密度较大,碰撞体会下沉,密度越小碰撞体会上浮密度和流体相同的碰撞体会浮在流体中
- SurfaceLevel:定义浮力流体的表面位置,对象高于此线时,不会对其施加浮力,以下或者相交会施加浮力。沿世界Y轴偏移
- LinearDrag:影响对象在水中移动的阻力系数
- AngularDrag:影响对象在水中旋转的阻力系数
- FlowAngle:流体流动方向相对世界控件的角度,沿指定方向施加浮力
- FlowMagnitude:与FlowAngle结合使用,前者决定力的角度,该值确定浮力大小
- FlowVariation:随机改变流体力的值
点效应器
类似区域效应器,但多出了根据中心点和目标物体点之间的距离计算
模拟磁铁吸引或者排斥的效果
- ForceMagnitude:施加力的大小
- ForceVariation:施加力的大小变化
- DistanceScale:效应器和目标之问举例的缩放。计算距离时,会按该比值对距商进行缩放
- ForceSource:力源来自哪个位置,从该点计算距离。
- Collider:碰撞器的位置
- Rigidbody:刚体的位置
- ForceTarget:作用力目标位置,用改点计算位置
- Collider:碰撞器的位置,如果碰撞器有偏移,可能会产生扭矩力
- Rigidbody:刚体的位置,不会产生扭矩力
- ForceMode:计算力的模式
- Constant:忽略源和目标之问相隔的距离
- InverseLinear:反线性距离计算,距离越远,力的大小呈线性减小
- InverseSquared:反平方距离计算,力的大小呈指数减小(接平方下降),类似现实世界重力
平台效应器
- RotationalOffset:旋转偏移量,控制平台角度偏移
- UseOneWay:是否使用单向碰撞行为
- UseOneWayGrouping:当平台式有多个碰撞器组合时,可以通过它将所有碰撞器设置为单向碰撞行为
- SurfaceArc:以局部坐标系下向上的方向为中心,填写一个角度值,定义不允许通过的表面,该角度外的其它地方视为单向碰撞
- UseSideFriction:是否应该在平台两侧使用摩擦
表面效应器
- Speed:表面保持的速度
- SpeedVariation:速度的随机增加值
- ForceScale:缩放沿表面移动时施加的力。如果是0表示不施加力,相当于禁用。值越低越慢,值越高越快,建议不要设置为1,因为当设置为1时可能会抵消施加在物体上的其它力,比如跳跃的力
- UseContactForce:是否对接触物体表面的出点施加力,如果选择会让对象旋转,如果不开启则不会旋转
- UseFriction:是否使用摩擦力
- UseBounce:是否使用弹力
瓦片地图
Tilemap一般称之为瓦片地图或者平铺地图 是unity2017中新增的功能 主要用于快速编辑2D游戏中的场景 通过复用资源的形式提升地图多样性
工作原理就是用一张张的小图排列组合为一张大地图
它和spriteShape的异同: 共同点 他们都是用于制作2D游戏的场景或地图的
不同点
- SpriteShape可以让地形有弧度,TileMap不行
- TileMap可以快捷制作有伪“Z"轴的地图,SpriteShape不行
Preview:预览图 Sprite:瓦片关联的精灵纹理 Color:瓦片色调颜色 Collider Type:碰撞器类型 None:不生成碰撞器 Sprite:基于精灵轮廓生成碰撞器形状 Grid:基于瓦片单元格生成碰撞器形状
做等距网格时,有时图片资源高低会有不同,手动设置轴心再绘制的话可能显示效果出错 需要在设置中将Transparency Sort Mode改成Custom Axis并且x,y,z分别为0,1,-0.26
在编辑等距瓦片地图时
- 需要修改工程的自定义轴排序以Y轴决定宣染顺序
- 如果地图存在前后关系需要修改TileRenderer的渲染模式
- 可以通过z轴偏移来控制绘制单个瓦片时的高度
- 精灵纹理的中心点会影响最终的显示效果
瓦片地图碰撞器
为挂载TilemapRenerer脚本的对象添加TilemapCollider2D脚本 会自动添加碰撞器 注意:想要生成碰撞器的瓦片colliderType类型要进行设置
- 等距瓦片地图的两项重要设置
- 两种等距瓦片地图的区别
- 等距瓦片地图的排序问题 3-1:轴心点排序 3-2:排序层排序(推荐)
- 等距瓦片地图角色不使用重力
- 等距瓦片碰撞器建议使用格子形状
- 等距瓦片地图上跳跃问题
代码控制瓦片
- Tilemap组件:用于管理瓦片地图
- TileBase组件:瓦片资源对象基类
- Grid组件:用于坐标转换
Tilemap
函数 | 作用 |
---|---|
ClearAllTiles | 清空瓦片地图 |
GetTile | 传入的时vector3int类型,要获取瓦片对象格子坐标 |
SetTile | 设置删除瓦片,在指定坐标设置或删除瓦片,传入TileBase对象是在该点设置瓦片,传入null是删除 |
SetTiles | 设置多张 |
SwapTile | 替换瓦片,将所有指定类型的瓦片资源替换成指定的瓦片资源 |
Grid |
函数 | 作用 |
---|---|
WorldToCell | 世界坐标转格子坐标 |
贡献者
版权所有
版权归属:PinkDopeyBug