一、刚体 Rigid Body 2D
刚体是物理系统中用于帮助我们进行模拟物理碰撞中力的效果的
2D 物理系统中的刚体和 3D 中的刚体基本是一样的,最大的区别是对象只会在 XY 平面中移动,并且只在垂直于该平面的轴上旋转
不同于 3D 刚体,2D 刚体具有以下三种类型:
(一)Dynamic
物体会受到力的影响移动和旋转
-
Material:物理材质
在刚体上设置了物理材质,若子物体有碰撞器但是没有设置材质,则会用刚体的物理材质
如果不设置,则将使用在 Physics 2D 窗口中设置的默认材质
物理材质使用的优先级:2D 碰撞器
>
2D 刚体>
Physics 2D 窗口 -
Simulated:子物体模仿,默认开启即可
如果希望 2D 刚体以及所有子对象 2D 碰撞器和 2D 关节都能模拟物理效果,则需要启用该选项
-
Use Auto Mass:是否使用自动质量
-
Mass:质量
-
Linear Drag:影响位置移动的阻力系数
-
Angular Drag:影响旋转移动的阻力系数
-
Gravity Scale:受重力影响的程度
-
Collision Detection:碰撞检测算法
- Discrete:离散检测算法,只会用新位置进行计算,速度太快时会穿过而检测不到
- Continuous:连续检测算法,计算量大,但不会发生穿过的现象
-
Sleeping Mode:对象处于静止状态时进入睡眠模式
- Never Sleep:从不休眠,会一直进行检测计算,性能消耗大
- Start Awake:最初处于唤醒状态,静止一段时间后会睡眠
- Start Asleep:最初处于睡眠状态,但是可以被碰撞唤醒
-
Interpolate:物理更新间隔之间的插值运算
- None:不应用移动平滑
- Interpolate:根据前一帧进行平滑处理
- Extrapolate:根据后一帧进行平滑处理
-
Constrains:约束限制,可以让某一个轴不受力影响位移或者旋转
-
Info:显示的物理信息,仅可查看不可修改
(二)Kinematic
不受力的影响,只能通过代码让其动起来
能和 Dynamic 2D 刚体产生碰撞,但是不会动,只会进入碰撞检测函数,因此没有质量、摩擦系数等属性
性能消耗较低,主要是使用代码处理移动和旋转
-
Material:物理材质
在刚体上设置了物理材质,若子物体有碰撞器但是没有设置材质,则会用刚体的物理材质
如果不设置,则将使用在 Physics 2D 窗口中设置的默认材质
物理材质使用的优先级:2D 碰撞器
>
2D 刚体>
Physics 2D 窗口 -
Simulated:子物体模仿,默认开启即可
如果希望 2D 刚体以及所有子对象 2D 碰撞器和 2D 关节都能模拟物理效果,则需要启用该选项
当启用时,会充当一个无限质量的不可移动的对象,可以和所有 2D 刚体产生碰撞
若 Use Full Kinematic Contacts 被禁用,则只会和 Dynamic 2D 刚体碰撞
-
Use Full Kinematic Contacts:充分使用运动学接触
如果希望能和所有 2D 刚体碰撞,则启用该选项
若不启用,则不会和 Kinematic 2D 和 Static 2D 刚体碰撞
-
Collision Detection:碰撞检测算法
- Discrete:离散检测算法,只会用新位置进行计算,速度太快时会穿过而检测不到
- Continuous:连续检测算法,计算量大,但不会发生穿过的现象
-
Sleeping Mode:对象处于静止状态时进入睡眠模式
- Never Sleep:从不休眠,会一直进行检测计算,性能消耗大
- Start Awake:最初处于唤醒状态,静止一段时间后会睡眠
- Start Asleep:最初处于睡眠状态,但是可以被碰撞唤醒
-
Interpolate:物理更新间隔之间的插值运算
- None:不应用移动平滑
- Interpolate:根据前一帧进行平滑处理
- Extrapolate:根据后一帧进行平滑处理
-
Constrains:约束限制,可以让某一个轴不受力影响位移或者旋转
-
Info:显示的物理信息,仅可查看不可修改
(三)Static
完全不动的需要检测碰撞的对象,相当于时无限质量不可移动的对象,性能消耗最小,只能和 Dynamic 2D 刚体碰撞
和它类似的有只加碰撞器而不加刚体的物体,它们会和刚体物体产生碰撞,但是自己不会动
总结:
-
Dynamic 动态刚体:受力的作用,要动要碰撞的对象
-
Kinematic 运动学刚体:通过刚体 API 移动的对象,不受力的作用,但是想要进行碰撞检测
-
Static 静态刚体:不动不受力作用的静态物体,但是想要进行碰撞检测
代码示例:
// 加力
Rigidbody2D rigid = this.GetComponent<Rigidbody2D>();
rigid.AddForce(new Vector2(0, 100));
// 速度
rigid.velocity = new Vector2(1, 0);
二、碰撞器 Collider 2D
碰撞器是用于在物理系统中表示物体体积的的(形状或范围),刚体通过得到碰撞器的范围信息进行计算,判断两个物体的范围是否接触,如果接触刚体就会模拟力的效果产生速度和旋转
(一)圆形碰撞器
- Editor Collider:碰撞器编辑器
- Material:一种物理材质,用于确定碰撞的属性,控制摩擦和弹性
- Is Trigger:是否为触发器
- Used By Effector:是否被附加到 2D 效应器使用
- Offset:圆心偏移位置
- Radius:圆形半径
(二)盒状碰撞器
-
Editor Collider:碰撞器编辑器
-
Material:一种物理材质,用于确定碰撞的属性,控制摩擦和弹性
-
Is Trigger:是否为触发器
-
Used By Effector:是否被附加到 2D 效应器使用
-
Used By Composite:是否被附加到 2D 复合碰撞器中使用
勾选后,将会消失一些属性,这些属性将在复合碰撞器中设置
-
Auto Tilling:如果精灵渲染器组件中的 Draw Mode 设置为 Tiled,勾选该选项后,当改变精灵大小时将自动更新碰撞器的尺寸
-
Offset:中心偏移位置
-
Size:矩形宽高
-
Edge Radius:使四个顶点为圆角
(三)多边形碰撞器
-
Editor Collider:碰撞器编辑器
-
Material:一种物理材质,用于确定碰撞的属性,控制摩擦和弹性
-
Is Trigger:是否为触发器
-
Used By Effector:是否被附加到 2D 效应器使用
-
Used By Composite:是否被附加到 2D 复合碰撞器中使用
勾选后,将会消失一些属性,这些属性将在复合碰撞器中设置
-
Auto Tilling:如果精灵渲染器组件中的 Draw Mode 设置为 Tiled,勾选该选项后,当改变精灵大小时将自动更新碰撞器的尺寸
-
Offset:中心偏移位置
-
Points:多边形顶点
(四)边界碰撞器
边界碰撞器一般不会手动通过数值加点,主要还是通过 Edit Collider
- Editor Collider:碰撞器编辑器
- Material:一种物理材质,用于确定碰撞的属性,控制摩擦和弹性
- Is Trigger:是否为触发器
- Used By Effector:是否被附加到 2D 效应器使用
- Offset:中心偏移位置
- Edge Radius:使四个顶点为圆角
- Points:顶点
(五)胶囊碰撞器
- Editor Collider:碰撞器编辑器
- Material:一种物理材质,用于确定碰撞的属性,控制摩擦和弹性
- Is Trigger:是否为触发器
- Used By Effector:是否被附加到 2D 效应器使用
- Offset:中心偏移位置
- Size:胶囊的宽高
- Direction:胶囊方向
- Horizontal:水平方向
- Vertical:竖直方向
(六)复合碰撞器
复合碰撞器会将其子物体所有的碰撞器合并在一起,得到一个新的碰撞器
复合碰撞器必须配合刚体使用
- Material:一种物理材质,用于确定碰撞的属性,控制摩擦和弹性
- Is Trigger:是否为触发器
- Used By Effector:是否被附加到 2D 效应器使用
- Offset:中心偏移位置
- Geometry Type:几何学类型,合并碰撞体时,顶点将组合为两种不同的几何体类型
- Outlines:空心轮廓,类似边界碰撞器
- Polygons:实心多边形,类似多边形碰撞器
- Generation Type:生成类型,复合碰撞器在何时生成新的几何体
- Synchronous:对 2D 复合碰撞器或使用的其他碰撞器修改时,Unity 立即生成新几何体
- Manual:手动生成新的几何体,通过代码生成或者点击下方的 Regenerate Collider 按钮
- Vertex Distance:从复合碰撞器手机顶点时允许的最小间距值
- Offset Distance:合并顶点时的偏移位置,可以理解为生成几何体的圆润程度
- Edge Radius:使顶点为圆角
碰撞检测函数:
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) { }
三、物理材质 Material 2D
物理材质是用于决定在物体产生碰撞时这些物体之间的摩擦和弹性表现的
通过物理材质我们可以做出类似斜坡不滑落,小球反弹等效果
- Friction:摩擦系数,0 表示没有摩擦力
- Bounciness:反弹程度,0 表示没有弹力,1 表示没有能量损失一直反弹
恒定力是一个特殊的脚本,它可以给一个 2D 刚体持续添加一个力
在做一些随着时间推移而加速的对象时很适用,比如类似火箭发射等效果
恒定力脚本会线性的为对象添加力和扭矩力,让其移动和旋转
- Force:物理更新时施加于 2D 刚体上的线性力
- Relative Force:物理更新时施加的线性力(相对刚体对象的坐标系)
- Torque:物理更新时施加于 2D 刚体的扭矩力
五、2D 效应器 Effector 2D
2D 效应器是配合 2D 碰撞器一起使用的,可以让游戏对象在相互接触时产生一些特殊的物理作用力
可以通过 2D 效应器快捷地实现一些传送带、互斥、吸引、漂浮、单向碰撞等等效果
使用效应器需要同时添加 Effector 2D 和 Collider 2D 组件,并且把 Used By Effector 和 Is Trigger 都勾选上
(一)区域效应器 Area
主要作用:在一个区域内让游戏对象受到力和扭矩力的作用
-
Use Collier Mask:是否启用碰撞器遮罩,如果开启才会出现 Collider Mask
可以通过选择层,决定改效应器只会作用于哪些层的对象,区分对待不同物体
-
Collider Mask:碰撞器遮罩层
-
Use Global Angle:勾选将使用世界坐标系的角度,如果不勾选,角度为局部角度
-
Force Angle:施加力的角度
-
Force Magnitude:施加力的大小
-
Force Variation:施加力的随机大小变化,会在 Force Magnitude 基础上根据该值进行随机变化
-
Force Target:效应器在目标对象上施加力的作用点
- Collider:以碰撞器当前的位置施加力,如果碰撞器有偏移,没有位于质心,则会产生扭矩力,带来旋转
- Rigidbody:以刚体当前的质心施加力,不会产生扭矩力
-
Drag:阻力
-
Angular Drag:扭矩阻力
(二)浮力效应器 Buoyancy
主要作用:模拟流体行为,浮动和阻力相关设置,让玩家在该区域看起来像在水里移动
-
Use Collier Mask:是否启用碰撞器遮罩,如果开启才会出现 Collider Mask
可以通过选择层,决定改效应器只会作用于哪些层的对象,区分对待不同物体
-
Collider Mask:碰撞器遮罩层
-
Density:流体密度
碰撞体密度大,则碰撞体会下沉;密度小,则碰撞体会上浮
密度和流体相同的碰撞体会浮在流体中
-
Surface Level:定义浮力流体的表面位置
对象高于此线时,不会对其施加浮力;低于或相交此线时,会施加浮力,沿世界坐标的 Y 轴偏移
-
Linear Drag:阻力
-
Angular Drag:扭矩阻力
-
Flow Angle:流体流动方向相对世界空间的角度,将会沿指定方向施加浮力
-
Flow Magnitude:与 Flow Angle 结合使用,该值决定浮力的大小
-
Flow Variation:随即改变流体的力的大小值
(三)点效应器 Point
主要作用:模拟类似磁铁吸引或排斥的效果
-
Use Collier Mask:是否启用碰撞器遮罩,如果开启才会出现 Collider Mask
可以通过选择层,决定改效应器只会作用于哪些层的对象,区分对待不同物体
-
Collider Mask:碰撞器遮罩层
-
Force Magnitude:施加力的大小
-
Force Variation:施加力的随机大小变化,会在 Force Magnitude 基础上根据该值进行随机变化
-
Distance Scale:效应器和目标之间距离的缩放,计算距离时,会按照该比值对距离进行缩放
- Collider:碰撞器当前的位置
- Rigidbody:刚体当前的质心位置
-
Force Target:效应器在目标对象上施加力的作用点
- Collider:以碰撞器当前的位置施加力,如果碰撞器有偏移,没有位于质心,则会产生扭矩力,带来旋转
- Rigidbody:以刚体当前的质心施加力,不会产生扭矩力
-
Force Mode:计算力的模式
- Constant:忽略和源与目标之间的距离
- Inverse Linear:反线性距离计算,距离越远,力的大小呈线性减小
- Inverse Squared:反平方距离计算,力的大小呈指数减小,类似现实世界的重力
-
Drag:阻力
-
Angular Drag:扭矩阻力
(四)平台效应器
主要作用:2D 游戏当中的平台或可往上跳跃的墙壁
这里的 Collider 不需要勾选 Is Triiger,因为是平台
-
Use Collier Mask:是否启用碰撞器遮罩,如果开启才会出现 Collider Mask
可以通过选择层,决定改效应器只会作用于哪些层的对象,区分对待不同物体
-
Collider Mask:碰撞器遮罩层
-
Rotational Offset:旋转偏移量,控制平台角度偏移
-
Use One Way:是否使用单向碰撞行为
-
Use One Way Grouping:当平台是有多个碰撞器组合时,可以通过它将所有碰撞器设置为单向碰撞行为
-
Surface Arc:以局部坐标系从下向上的方向为中心,填写一个角度值,定义不允许通过的表面,该角度外的其他地方视为单向碰撞
-
Use Side Friction:是否在平台两侧使用摩擦
-
Use Side Bounce:是否在平台两侧使用弹性
-
Side Arc:用于定义左右两侧平台的相应弧度
(五)表面效应器
主要作用:模拟传送带
这里的 Collider 不需要勾选 Is Triiger,因为是表面
-
Use Collier Mask:是否启用碰撞器遮罩,如果开启才会出现 Collider Mask
可以通过选择层,决定改效应器只会作用于哪些层的对象,区分对待不同物体
-
Collider Mask:碰撞器遮罩层
-
Speed:表面保持的速度
-
Speed Variation:速度的随机增加值
-
Force Scale:缩放沿表面移动时施加的力
0 表示不施加力,相当于禁用,值越低越慢,值越高越快
不建议设置为 1,因为这可能会抵消施加在物体的其他里,比如跳跃起来的力
-
Use Contact Force:是否对接触物体表面的接触点施加力
如果选择则会让物体旋转,如果不选择则不会旋转
-
Use Friction:是否使用摩擦
-
Use Bounce:是否使用弹力