SpriteResolver换装

如何在同一个psb文件中制作换装资源

  1. 在ps中制作美术资源时,将一个游戏对象的所有换装资源都摆放好位置
  2. 当我们导入该资源时,要注意是否导入隐藏的图层

编辑换装资源的骨骼信息以及分组类别

  1. 每个部位 关联的骨骼要明确设置
  2. 为同一个部位的不同装备分组

如何换装

两个关键组件

  • SpriteLibrary——精灵资料库,确定类别分组信息
  • SpriteResolver——精灵解算器,用于确定部位类别和使用的图片

一个数据文件

  • SpriteLibraryAsset——精灵资料库资源,具体记录类别分组信息的文件
  1. 创建SpriteLibraryAsset 将精灵文件拖入
  2. 在父对象添加SpriteLibrary组件 并和SpriteLibraryAsset关联
  3. 找到需要换装的Sprite子物体 挂载SpriteResolver组件

代码控制换装

获取SpriteResolver

public SpriteResolver sr;
sr = GetComponent<SpriteResolver>();

获取当前部位默认的类别名

sr.GetCategory();

设置当前部位想要切换的图片信息

sr.SetCategoryAndLabel(sr.GetCategory(), "CASK 1");

2D反向动力学IK

  • 在骨骼动画中,构建骨骼的方法被称为正向动力学
    • 子骨骼(关节)的位置根据父骨骼(关节)的旋转而改变
  • 而IK全称是Inverse Kinematics,翻译过来的意思就是反向动力学的意思
  • 它和正向动力学恰恰相反
  • 它的表现形式是,子骨骼(关节)末端的位置改变会带动自己以及自己的父骨骼(关节)旋转

导入IK包

  • 在Package Manager窗口中引入2D IK工具包
  • 需要在Advanced高级选项中选中Show preview packages(显示预览包)
  • 这样才能看到2D IK相关内容

使用IK

  • 需要在对象添加IK Manager 2D组件
  • 在关节末端 创建空物体(ik点位置)
  • 在IK Manager 2D中的IK Solvers里面添加ik
  • 添加ik后Unity会自动创建ik对象
  • 在ik对象中 将骨骼节点和Effector相关联
  • 创建Target

IK Manager 2D参数

  • IK Solvers:IK解算器,在这里添加IK
    • Chain(CCD) 可以自定义影响N个关节点,不能反向
    • Chain(FABRIK)可以自定义影响N个关节点,可以反向
    • Limb 只会影响3个关节点
  • Weight权重 当有多个IK控制同一点时权重会影响控制的百分比
  • Restore Default Pose 恢复默认位置

Limb Solver 2D组件参数

  • Effector:默认的ik点位置
  • Target 会根据ik点位置生成真正的ik对象
  • Flip 反向
  • Constrain Rotation 约束旋转程度
  • Solve from Default Pose 从默认姿势进行求解计算
  • Weight 权重

CCD Solver 2D组件参数

  • Chain Length:IK影响的骨骼数量
  • Iterations:算法运行的次数
  • Tolerance:容错程度
  • Volcoity 速度
  • Constrain Rotation 约束旋转程度
  • Solve from Default Pose 从默认姿势进行求解计算
  • Weight 权重

2D骨骼动画(2D Animation)

2D骨骼动画

2D骨骼动画主要方式有两种

  • 使用Unity2018新加功能 2D Animation工具制作
  • 使用跨平台骨骼动画制作工具 Spine制作

导入2D Animation工具

在Package Manager窗口 搜索2D Animation并安装

创建骨骼

/usr/uploads/2024/06/QQ截图20240624131548.png

打开Sprite Editor 选择 Skinning Editor

/usr/uploads/2024/06/image-20240624131816489.png

Pose

  • PreviewPose 预览模式,可以预览动作 并不会真正的改变变量
  • RestPose 将骨骼和关节恢复到原始位置

Bone 骨骼相关

  • Edit Bone 编辑骨骼 可以改变骨骼的位置 长度 方向 名称等
  • Create Bone 创建骨骼
  • Split Bone 拆分骨骼 将一个骨骼 一分为二

Geomtry蒙皮相关

蒙皮决定了骨骼主要控制哪一部分

  • Auto Geometry自动蒙皮

  • /usr/uploads/2024/06/image-20240624133523939.png

2D序列帧动画

2D序列帧动画

创建序列帧动画

方法一:

  1. 创建一个空物体
  2. 创建一个动画
  3. 将图片拖入Animation窗口中

方法二:

直接将图片拖入Hierarchy窗口中 会自动创建

修改动画速度

  1. 删掉动画中的帧
  2. 选择动画 在Inspector面板中 右上角三个点按钮 选debug模式
  3. 调整Sample Rate 值
  4. 将图拖入Animation窗口中 重新创建序列帧

Animator动画状态机

什么是有限状态机

有限状态机(Finite - state machine, FSM)又称有限状态自动机,简称状态机。表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。

  • 有限:表示是有限度的不是无限的
  • 状态:指所拥有的所有状态

举例说明:

假设我们人会做很多个动作,也就是有很多种状态

这些状态包括 站立、走路、跑步、攻击、防守、睡觉等等

我们每天都会在这些状态中切换,而且这些状态虽然多但是是有限的

当达到某种条件时,我们就会在这些状态中进行切换

而且这种切换时随时可能发生的

有限状态机对于我们的意义

游戏开发中有很多功能系统都是有限状态机

最典型的状态机系统

动作系统 —— 当满足某个条件切换一个动作,且动作是有限的

AI(人工智能)系统 —— 当满足某个条件切换一个状态,且状态时有限的

所以状态机是游戏开发中一个必不可少的概念

创建动画状态机

  1. 通过为场景中物体创建动画时自动创建
  2. 手动创建动画状态机文件

Animator中的API

//通过状态机条件切换动画
animator.SetFloat("条件名", 1.2f);
animator.SetInteger("条件名", 5);
animator.SetBool("条件名", true);
animator.SetTrigger("条件名");

animator.GetFloat("条件名");
animator.GetInteger("条件名");
animator.GetBool("条件名");

//2.直接切换动画 除非特殊情况 不然一般不使用
animator.Play("状态名");

动画子状态机

  • 子状态机顾名思义就是在状态机里还有一个状态机
  • 它的主要作用就是某一个状态时由多个动作状态组合而成的复杂状态
  • 比如某一个技能它是由3段动作组合而成的,蹲下,开火,站起
  • 当我们释放这个技能时会连续播放这3个动作

创建子状态机

在Animator Controller窗口中右键->Create Sub-State Machine

注意

在子状态机中 如果想要切换回去 需要在子状态机内 和主状态机的状态相连

Animation老动画系统

老动画系统

什么是老动画系统

  • Unity中有两套动画系统
  • 新:Mecanim动画系统——主要用Animator组件控制动画
  • 老:Animation动画系统——主要用Animation组件控制动画(Unity4之前的版本可能会用到)
  • 目前我们为对象在Animation窗口创建的动画都会被新动画系统支配
  • 有特殊需求或者针对一些简易动画,才会使用老动画系统

Animation组件

/usr/uploads/2024/06/image-20240622132044039.png

  • Animation:默认播放的动画
  • Animations:该动画组件可以控制的所有动画
  • Play AutoMatically:是否一开始就自动播放默认动画
  • Animate Physics:动画是否与物理交互
  • Culling Type:决定什么时候不播放动画
    • Always Animate:始终播放
    • Based On Renderers:基于默认动画姿势剔除

/usr/uploads/2024/06/image-20240622132118118.png

  • Default:读取设置得更高的默认重复模式
  • Once:播放一次就停止
  • Loop:从头到尾不停循环播放
  • PingPong:从头到尾从尾到头不停播放
  • ClampForever:播放结束会停在最后一帧,并且会一直播放最后一帧(相当于状态不停止),表现效果和Once一样,但是逻辑处理上不同

代码控制动画播放

获取动画组件

var animation = this.GetComponent<Animation>();

播放动画

animation.Play("1");
//淡入播放
animation.CrossFade("3");

前一个播完再播放下一个

Animation动画窗口面板

Animation窗口是用来干啥的

  • Animation窗口 直译就是动画窗口
  • 它主要用于在Unity内部创建和修改动画
  • 所有在场景中的对象都可以通过Animation窗口为其制作动画

打开Animation窗口

Window——>Animation——>Animation

动画时间轴

  • 每一个动画文件都有自己的一个生命周期,从动画开始到结束
  • 我们可以在动画时间轴上编辑每一个动画生命周期中变化

动画中的帧

  • 假设某个动画的帧率为60帧每秒,意味着该动画1秒钟最多会有60次改变机会
  • 每一帧的间隔时间是 1s/60 ≈ 16.67毫秒 也就是说 我们最快可以每16.67毫秒改变一次对象状态

关键帧

动画在时间轴上的某一个时间节点上处于的状态

Animation窗口功能

/usr/uploads/2024/06/image-20240622131237935.png

  • 预览模式(开关)
  • 录制模式(开关)打开后预览模式默认开始
  • 回到动画开头
  • 上一关键帧
  • 播放动画)
  • 下一关键帧
  • 回到动画结尾
  • 当前处于第几帧

/usr/uploads/2024/06/image-20240622131457215.png

  • Dopesheet关键帧模式
  • Curves曲线模式

/usr/uploads/2024/06/image-20240622131527520.png

  • 按选择筛选
  • 添加关键帧
  • 添加事件

创建动画

  1. 在场景中选中想要创建动画的对象
  2. 在Animation窗口中点击创建
  3. 选择动画文件将要保存到的位置

保存动画文件时,Unity会帮助我们完成以下操作

  1. 创建一个 Animator Controller(动画控制器或称之为动画状态机) 资源(新动画系统)
  2. 将新创建的动画文件添加到Animator Controller中
  3. 为动画对象添加Animator组件
  4. 为Animator组件关联创建的Animator Controller文件

面板变化

/usr/uploads/2024/06/image-20240622131808199.png 可以在这里创建新动画和切换动画

TitleMap瓦片地图

什么是Titlemap?

  • Tilemap一般称之为 瓦片地图或者平铺地图
  • 是Unity2017中新增的功能 主要用于快速编辑2D游戏中的场景

导入Titlemap包

Window-PackageManager 导入

瓦片

创建瓦片

方法一:

Assets——>Create——>Tile

方法二:

  1. 打开Tile Palette瓦片调色板窗口
  2. 新建一个瓦片地图编辑文件
  3. 将资源拖入到窗口中选择要保存的路径

瓦片参数

  • Preview :预览图
  • Sprite :瓦片关联的精灵纹理
  • Color : 瓦片的颜色
  • Collider Type : 碰撞器类型
    • None 不生成碰撞器
    • Sprite 基于精灵轮廓生成碰撞器的形状
    • Grid 基于瓦片单元格生成碰撞器形状

瓦片调色机

创建瓦片调色器参数

/usr/uploads/2024/06/image-20240621135043370.png

  • Name:瓦片调色器名称
  • Grid:瓦片的网格布局
    • Rectangle:矩形瓦片
    • Hexagon:六边形瓦片
    • Isometric:等距瓦片,单元格为菱形
    • Isometric Z as Y:等距瓦片并且Unity将单元格Z轴转换为局部Y坐标
  • Hexagon Type:六边形瓦片地图类型
    • Point Top:点朝顶部的六边形
    • Flat Top:面朝顶部的六边形
  • Cell Size:瓦片绘制到单元格的大小
    • Automatic:基于瓦片资源的精灵大小自动设置
    • Manual:自定义大小

操作技巧

  • 单击瓦片——选择瓦片
  • 在多个瓦片上移动——选择多个瓦片
  • Alt+左键拖动——平移
  • 滚轮键拖动——平移
  • 旋转滚轮键——放大/缩小

面板相关

/usr/uploads/2024/06/image-20240621135340593.png

2D效应器

2D效应器是什么?

  • 2D效应器是配合2D碰撞器一起使用
  • 可以让游戏对象在相互接触时产生一些特殊的物理作用力
  • 可以通过2D效应器快捷的实现一些传送带 互斥 吸引 漂浮 单向碰撞等等效果

效应器参数

区域效应器

主要作用:在一个区域内让游戏对象受到力和扭矩力的作用

  • Use Collider Mask:是否启用碰撞器遮罩,如果开启才会出现下面的Collider Mask,可以通过选择层,决定该效应器只会作用于哪些层的对象
  • Use Global Angle:勾选将使用世界坐标系角度,如果不勾选,角度为局部角度
  • Force Angle:施加力的角度
  • Force Magnitude:施加力的大小
  • Force Variation:施加力的随机大小变化 会在Force Magnitude基础上根据该值进行随机变化
  • ForceTarget:效应器在目标对象上施加力的作用点
    • Collider:以碰撞器的当前位置(如果碰撞器有偏移,没有位于质心,可能会产生扭矩力,带来旋转)
    • Rigidbody:以刚体的当前质心(不会产生扭矩力)
  • Drag:阻力
  • Angular Drag:扭矩阻力

浮力效应器

主要作用:模拟流体行为,浮动和阻力相关设置,让玩家在该区域看起来像在水里移动

  • Density:流体密度,密度较大,碰撞体会下沉,密度越小碰撞体会上浮 密度和流体相同的碰撞体会浮在流体中
  • Surface Level:定义浮力流体的表面位置,对象高于此线时,不会对其施加浮力,以下或者相交会施加浮力。沿世界Y轴偏移
  • Linear Drag:影响对象在水中移动的阻力系数
  • Angular Drag:影响对象在水中旋转的阻力系数
  • Flow Angle:流体流动方向相对世界空间的角度,沿指定方向施加浮力
  • Flow Magnitude:与FlowAngle结合使用,前者决定力的角度,该值确定浮力大小
  • Flow Variation:随机改变流体力的值

点效应器

主要作用:模拟磁铁 吸引或者排斥的效果

  • Force Magnitude:施加力的大小
  • Force Variation:施加力的大小变化
  • Distance Scale:效应器和目标之间举例的缩放。计算距离时,会按该比值对距离进行缩放
  • Force Source:力源来自哪个位置,从该点计算距离。
    • Collider:碰撞器的位置
    • Rigidbody:刚体的位置
  • Force Target:作用力目标位置,用该点计算位置
    • Collider:碰撞器的位置,如果碰撞器有偏移,可能会产生扭矩力
    • Rigidbody:刚体的位置,不会产生扭矩力
  • Force Mode:计算力的模式
    • Constant:忽略源和目标之间相隔的距离
    • Inverse Linear:反线性距离计算,距离越远,力的大小呈线性减小
    • Inverse Squared:反平方距离计算,力的大小呈指数减小(按平方下降),类似现实世界重力

平台效应器

主要作用:2D游戏当中的平台或可往上跳跃的墙壁

SpriteShape

SpriteShape是用来做什么的?

  • SpriteShape是精灵形状的意思
  • 它主要是方便我们以节约美术资源为前提制作2D游戏场景地形或者背景的

导入SpriteShape工具

  1. 在Package Manager中导入相关工具
  2. 可以选择性导入事例和拓展资源

准备 精灵形状概括资源

  • 想要节约美术资源的创建地形或其它类似资源
  • 首先我们要准备精灵形状概括资源
  • 之后我们就会使用它来创建地形等资源

SpriteShape的类型

  1. 开放不封闭的图形
  2. 封闭的图形

Sprite Shape Profile 精灵形状概述文件配置

  • Use Sprite Borders 是否使用精灵边框 用于九宫格拉伸
  • Texture 用于填充实心部分的纹理(使用的纹理的平铺模式必须是Repeat重复模式)
  • Offset 纹理偏移量
  • 这里的设置主要用于封闭的图形 再不同的角度范围使用的图片不同 达到一个封闭效果
    • Angle Ranges 角度范围
    • Start 起始角度
    • End 结束角度
    • Order:Sprite相交时的优先级 优先级高的显示在前面
  • Sprites 指定角度范围内的精灵列表 再该角度范围内 可以选择使用的图片资源
  • Corners 指定角显示的精灵图片 主要用于封闭图形
    • 外部四个角使用的图片
    • 内部四个角使用的图片

Sprite Shape Renderer精灵形状渲染器组件

该控件主要是控制 材质 颜色 以及和其它Sprite交互时的排序等等信息

参数

  • Color:颜色
  • Mask Interaction:遮罩相互作用规则设置
  • Fill Material和Edge Material:填充材质和边缘材质
  • Sorting Layer和Order in Layer:排序相关

Sprite Shape Controller精灵形状控制器组件

参数

  • Profile:使用的精灵形状概述文件
  • Detail:精灵形状的质量高中低三种质量
  • Is Open Ended:是否是开放的,不封闭的
  • Adaptive UV:自适应UV,如果开启,会自动帮助我们判断是平铺还是拉伸 开启后只有宽度够才会平铺,如果宽度不够会拉伸 不开启始终平铺,但是可能会出现裁剪效果 一般根据你的实际效果进行选择
  • Optimize Geometry:优化三角形数量,勾选后会最小化精灵图形中的三角形数量
  • Enable Tangents:是否启用切线计算功能 如果你的着色器中需要切线信息参与计算,则勾选
  • Corner Threshold:角阈值,当拐角处的角度达到这个阈值时将使用角图片
  • Stretch UV:是否拉伸UV,如果勾选纹理的UV将伸展到整个精灵形状的直线上
  • Pixel Per Unit:禁用拉伸UV时才有,Unity单位对应多少像素,较高的值会较少纹理的大小
  • Worldspace UV:根据世界控件的UV填充纹理

启用编辑状态 参数

  • Tangent Mode :切线模式
    • 顶点模式-点两侧不构成曲线
    • 切线模式-点两侧构成曲线,并且可以控制切线弧度
    • 左右切线模式-点两侧构成曲线,并且可以分别控制左右两侧切线弧度
  • Position:选中点的局部坐标位置
  • Height:控制点左右两侧精灵图片的高度
  • Corner:是否使用角度图片
    • Disabled:不使用角度图片
    • Automatic:自动
  • Sprite Variant:选择使用的精灵图片
  • Snapping:是否开启捕捉设置控制点

2D恒定力组件Constant Force

  • 恒定力是一个特殊的脚本
  • 它可以给一个2D刚体持续添加一个力
  • 在做一些随着时间推移而加速的对象时很适用

参数

  • Force 物理更新时 施加在刚体上的力
  • Relative Force 相对本地坐标系加力
  • Torque 物理更新时 施加在刚体上的扭矩力

2D碰撞器

  • 碰撞器是用于在物理系统中 表示物体体积的的(形状或范围)
  • 刚体通过得到碰撞器的范围信息进行计算
  • 判断两个物体的范围是否接触 如果接触 刚体就会模拟力的效果产生速度和旋转

碰撞器组件参数

  • Material:物理材质,用于确定碰撞的属性,控制摩擦和弹性
  • Is Trigger:是否是触发器
  • Used By Effector:是否被附加的2D效应器使用
  • Offset:圆心偏移位置
  • Radius:圆形的半径

多边形碰撞器和边界碰撞器参数

Points:多边形顶点 虽然可以手动修改,但是一般情况下 我们通过数值编辑太复杂了 都通过Edit Collider编辑,或者让Unity自动识别创建

边界碰撞器的编辑主要还是通过Edit Collider 一般不会手动去通过数值加点

胶囊碰撞器参数

  • Size:胶囊的宽高
  • Direction:是竖直胶囊还是水平胶囊

复合碰撞器参数

  • Geometry Type:几何学类型,合并碰撞体时,碰撞体顶点将组合为两种不同的几何体类型
    • Outlines:空心轮廓,类似边界碰撞器
    • Polygons:实心多边形,类似多边形碰撞器
  • Generation Type:生成类型,复合碰撞器在何时生成新几何体
    • Synchronous:对2D复合碰撞器或使用的其它碰撞器修改时,Unity立即生成新几何体
    • Manual:手动生成新几何体,通过代码生成或者点击下发的Regenerate Geometry生成按钮
  • Vertex Distance:从复合碰撞器收集顶点时允许的最小间距值

碰撞检测函数

private void OnCollisionEnter2D(Collision2D collision)
{

}

private void OnCollisionExit2D(Collision2D collision)
{

}

private void OnCollisionStay2D(Collision2D collision)
{

}

private void OnTriggerEnter2D(Collider2D collision)
{

}

private void OnTriggerExit2D(Collider2D collision)
{

}

private void OnTriggerStay2D(Collider2D collision)
{

}

2D刚体

  • 刚体是物理系统中用于帮助我们进行模拟物理碰撞中力的效果的
  • 2D物理系统中的刚体和3D中的刚体基本是一样的
  • 最大的区别是对象只会在XY平面中移动,并且只在垂直于该平面的轴上旋转

2D刚体参数

Dynamic:动态类型 受重力和力的影响移动和旋转

Material: 物理材质,在刚体上设置了物理材质,如果子物体有碰撞器但是没有设置材质则会通用刚体的物理材质 如果不设置,将使用在Physics 2D窗口中设置的默认材质

物理材质的使用优先级:

  • 2D碰撞器上指定的2D物理材质
  • 2D刚体上指定的2D物理材质
  • Physics 2D窗口指定的2D默认物理材质

Simulated

如果希望2D刚体以及所有子对象2D碰撞器和2D关节都能模拟物理效果 需要启用该选项

Use Auto Mass:是否使用自动质量

Mass: 质量

  • Linear Dray:影响位置移动的阻力系数
  • Angular Drag:影响旋转移动的阻力系数
  • Gravity Scale:受重力影响的程度

**Collision Detection:**碰撞检测算法

  • Discrete:离散检测算法,只会用新位置进行计算,速度过快时会穿过
  • Continuous:连续检测算法,计算量更大,但是不会发生穿过的情况

Sleeping Mode:对象处于静止状态时进入睡眠模式

  • Never Sleep:从不休眠,会一直进行检测计算,性能消耗较大
  • Start Awake:最初处于唤醒状态
  • Start Asleep:最初处于睡眠状态,但是可以被碰撞唤醒

Interpolate:物理更新间隔之间的插值运算

  • None:不应用移动平滑
  • Interpolate:根据前一帧进行平滑处理
  • Extrapolate:根据后一帧位置进行平滑处理

Constraints:约束限制 可以让某一个轴不受力影响位移或者旋转

Kinematic:运动学类型

不受力的影响,只能通过代码让其动起来 能和Dynamic 2D刚体产生碰撞,但是不会动,只会进入碰撞检测函数 因此它没有了质量莫摩擦系数等属性

因此它的性能能消耗较低,主要会通过代码来处理其移动旋转

**Simulated:**如果希望2D刚体以及所有子对象2D碰撞器和2D关节都能模拟物理效果 需要启用该选项

当启用时,会充当一个无限质量的不可移动对象,可以和所有2D刚体产生碰撞 如果Use Full Kinematic Contacts禁用,它只会和Dynamic 2D刚体碰撞

**Use Full Kinematic Contacts:**如果希望能和所有2D刚体碰撞,启用它 如果不启用,它不会和Kinematic 2D和Static 2D刚体碰撞

Static:静态类型

完全不动的需要检测碰撞的对象 相当于是无限质量不可移动的对象 它的性能消耗最小,它只能和Dynamic 2D刚体碰撞 和它类似的有只加碰撞器而不加刚体的物体 它们会和刚体物体产生碰撞,但是自己不会动

SpriteAtlas 精灵图集

在Unity中打开自带的打图集功能

  • Edit——>Project Setting——>Editor
  • Sprite Packer(精灵包装器,可以通过Unity自带图集工具生成图集)
    • Disabled:默认设置,不会打包图集(3D项目默认不打包图集)
    • Enabled For Builds(Legacy Sprite Packer):Unity仅在构建时打包图集,在编辑模式下不会打包图集
    • Always Enabled(Legacy Sprite Packer):Unity在构建时打包图集,在编辑模式下运行前会打包图集
    • Enabled For Build:Unity进在构建时打包图集,在编辑器模式下不会打包
    • Always Enabled:Unity在构建时打包图集,在编辑模式下运行前会打包图集

传统打包模式Legacy Sprite Packer

相对下面两种模式来说 多了一个设置图片之间的间隔距离

Padding Power:选择打包算法在计算打包的精灵之间以及精灵与生成的图集边缘之间的间隔距离

图集面板参数相关

Type 图集类型

主图集Master

  • Include in Build 选中可以在当前构建中包含图集
  • Allow Rotation 选中此选项将在打包图集时对图片元素进行旋转 可以最大限度的提高组合后的图集密度
    • 注意:如果是UI图集 需要禁用该选项 因为打包时会将UI元素旋转
  • Tight Packing 打包图集时实用图片轮廓来打包 而不是矩形 可以最大限度提高组合后的图集密度
  • Padding 图集中图片的间隔

变体图集Variant

  • Master Atlas 关联的主图集
  • Include in Build 选中可以在当前构建中包含图集
  • Scale 设置变体图集的缩放因子(0~1)变体图集的大小是主图集乘以Scale的结果

什么是变体图集?

变体图集的是以主图集为基础,对他进行缩放产生一个新的图集副本。如果想实用变体图集中的内容,需要勾选变体图集的Include in Build选项 ,而主图集禁用此选项即可

代码加载图集

GameObject obj = new GameObject();
SpriteRenderer sr = obj.AddComponent<SpriteRenderer>();
//加载图集资源
SpriteAtlas spriteAtlas = Resources.Load<SpriteAtlas>("MyAtlas");
//加载图集资源中的某一张小图
sr.sprite = spriteAtlas.GetSprite("dead1");

SpriteMask精灵遮罩

  • Sprite:遮罩图片(形状)
  • Alpha Cutoff:如果Alpha包含透明区域和不透明区域之间的混合(半透明)则可以手动确定显示区域的分界点
  • Custom Range 自定义遮罩范围:开启后可以设置这招i的范围 按照排序层来划分

SortingGroup精灵分组

  • SortingGroup是排序分组的意思
  • 它的主要作用就是对多个精灵图片进行分组排序
  • Unity会将同一个排序组中的精灵图片一起排序,就好像他们是单个游戏对象一样
  • 主要作用是对于需要分层的2D游戏用于整体排序
  • 子排序组,先排子对象 再按父对象和别人一起排 (同层和同层比)
  • 多个 挂载排序分组组件的预设体 之间 通过修改 排序索引号来决定前后顺序

Sprite Renderer组件

Sprite:渲染的精灵图片

Color:定义着色 一般没有特殊需求不会修改

Filp:水平或者垂直翻转精灵图片

Draw Mode 绘制模式 当尺寸变化时的缩放方式

  • Simple 简单模式 缩放时整个图像一起缩放

  • Sliced 切片模式 九宫格切片模式

  • Tiled 平铺模式 需要把精灵的网络类型设置为Full Rect

    • Continuous:当尺寸变化时 中间部分将均匀平铺

    • Adaptive 当尺寸变化时 雷士Simple模式 当尺寸达到Stretch Value时中间才开始平铺

Mask Interaction 与精灵遮罩交互时的方式

  • None 不与场景中的任何精灵遮罩交互
  • Visible inside Mask 精灵遮罩覆盖的地方可见 而遮罩外部不可见
  • Visible Outside Mask 精灵遮罩外部的地方可见 而遮罩覆盖处不可见

Material材质:

​ 可以使用一些自定义材质来显示一些特殊效果

​ 一般情况不修改,默认材质是不会受到光照影响的,如果想要受到光照影响 可以选择Default-Diffuse

Additional Settring 高级设置

  • Sorting Layer 排序层选择
  • Order in Layer 层级序列号 数值大的后渲染(显示在前面)

通过Resources加载Sprite

private Dictionary<string, Dictionary<string, Sprite>> dic = new ();
var sprs = Resources.LoadAll<Sprite>(multipleName);
for (int i = 0; i < sprs.Length; i++)
{
    dicTmp.Add(sprs[i].name, sprs[i]);
}

Sprite Editor

  • SpriteEditor就是 精灵图片编辑器,它主要用于编辑2D游戏开发中使用的Sprite精灵图片,可以编辑 图集中提取元素,设置精灵边框,设置九宫格,设置轴心(中心)点等等
  • 新版本Unity 需要安装 2D Sprite包才能使用SpriteEditor

Sprite Editor 窗口按钮

左下角设置窗口

/usr/uploads/2024/06/image-20240618141022488.png

  • Name:名字
  • Position 在图片中的偏移位置和宽高
  • Border 边框 用于九宫格切图的四条边
  • Pivot 轴心 中心点位置
  • Pivot Unit Mode:轴心点单位模式
    • Normalizd 标准化模式0~1
    • Pixels 像素模式
  • Custom Pivot 自定义轴心点

顶部设置按钮

/usr/uploads/2024/06/image-20240618141207686.png

  • Snap:将控制点贴近在最近的像素
  • Outline Tolerance 轮廓点的复杂性和准确性 值越大 轮廓点越多越准确
  • Generate 生成网络轮廓

Custom Outline(决定渲染区域)

  • 自定义边缘线设置,可以自定义精灵网格的轮廓形状
  • 默认情况下不修改都是在矩形网格上渲染,边缘外部透明区域会被渲染,浪费性能
  • 使用自定义轮廓,可以调小透明区域,提高性能

Custom Physics Shape(决定碰撞判断区域)

  • 自定义精灵图片的物理形状,主要用于设置需要物理碰撞判断的2D图形
  • 它决定了之后产生碰撞检测的区域

Secondary Textures(为图片添加特殊效果)

  • 次要纹理设置,可以将其它纹理和该精灵图片关联
  • 着色器可以得到这些辅助纹理然后用于做一些效果处理
  • 让精灵应用其它效果

Multiple图集模式

  • 当我们的图片资源是图集时
  • 我们需要在设置时将模式设置为Multiple
  • 这时我们可以使用Sprite Editor自带的功能进行图集元素分割

自动分割

  • Pivot 单张图片轴心点位置
  • Custom Pivot 自定义轴心点
  • Method 如何处理现有对象
    • Delete Exiting 替换掉已经选择的任何矩形
    • Smart 尝试创建新的矩形 同时保留或者调整现有矩形
    • Safe 添加新的矩形而不是更改任何已经存在的矩形

按单元格大小分割

  • PixelSize 单元格宽高
  • Offset:偏移位置
  • Padding 和边缘的偏移位置
  • Keep Empty Rects 是否保留空矩形

平分切割

Column&row:行列数

MipMap是什么?

在三维计算机图形的贴图渲染中有一个常用的技术被称为Mipmapping。

为了加快渲染速度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件

这样的贴图被称为mipmap

Mipmap 需要占用一定的内存空间

Mipmap中每一个层级的小图都是主图的一个特定比例的缩小细节的复制品

虽然在某些必要的视角,主图仍然会被使用,来渲染完整的细节。

但是当贴图被缩小或者只需要从远距离观看时,mipmap就会转换到适当的层级

因为mipmap贴图需要被读取的像素远少于普通贴图,所以渲染的速度得到了提升。

而且操作的时间减少了,因为mipmap的图片已经是做过抗锯齿处理的,从而减少了实时渲染的负担。

放大和缩小也因为mipmap而变得更有效率。

如果贴图的基本尺寸是256x256像素的话,它mipmap就会有8个层级。

每个层级是上一层级的四分之一的大小

依次层级大小就是:128x128;64x64;32x32;16x16;8x8;4x4;2x2;1x1(一个像素)

说人话,开启MipMap功能后,Unity会帮助我们根据图片信息生成n张不同分辨率的图片

在场景中会根据我们离该模型的距离选择合适尺寸的图片用于渲染,提升渲染效率

线性和伽马空间

线性和伽马空间

人眼对光强的反应不呈线性,我们在观察光时会发现一些亮度比另一些亮度更容易看到,即从黑到白的线性渐变在我们人眼中不是线性渐变的。

/usr/uploads/2024/06/image-20240618103016066.png

左:线性渐变。右:人眼对该渐变的感知情况。注意每种情况下界限(正好是中灰色)与渐变相融合的位置

由于历史原因,监视器和显示器具有相同的特性,向监视器发送线性信号会导致看起来像上图右侧的渐变,人眼观察感觉是错误的。为了弥补这一点,需要发送经校正的信号来确保监视器能够呈现出看起来自然的图像。这种校正称为伽马校正 伽马和线性颜色空间同时存在的原因是,光照计算应该在线性空间中进行,以便确保数学上的正确性,但结果应该在伽马空间中呈现以便让人眼看起来正确 在帧缓冲中格式限制为每通道8位的旧硬件上,计算光照时使用伽马曲线可在人类可感知的范围内提供更高的精度。在人眼最敏感的范围内,使用的位数最多 即使当今的监视器是数字显示器,它们仍然采用伽马编码信号作为输入信号。图像文件和视频文件显式编码到如马空间(这意味着它们带有加马编码值,而不是线性强度)。这便是标准:一切数值都在伽马空间内, 伽马空间的公认标准称为 sRGB(请参阅 Wikipedia)。该标准定义了它与线性空间之间的一个映射,使得人眼能充分利用8位/通道的精度 线性渲染指的是渲染场景的过程,此情况下的所有输入都是线性的,也就是说,没有经过伽马校正以适合人眼观察或输出到显示器。