Unity2D-物理系统
刚体
刚体是物理系统中用于帮助我们进行模拟物理碰撞中力的效果的
2D 物理系统中的刚体和 3D 中的刚体基本是一样的
最大的区别是对象只会在 xy 平面中移动,并且只在垂直于该平面的轴上旋转
Body Type刚体类型
Dynamic: 动态类型受重力和力的影响移动和旋转
Material:物理材质,在刚体上设置了物理材质,如果子物体有碰撞器但是没有设置材质则会通用刚体的物理材质
如果不设置,将使用在 Physics 2D 窗口中设置的默认材质
物理材质的使用优先级:
1.2D 碰撞器上指定的 2D 物理材质
2.2D 刚体上指定的 2D 物理材质
3.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 刚体碰撞
怎么选择不同的刚体
Dynamic 动态刚体:受力的作用,要动要碰撞的对象
Kinematic 运动学刚体:通过刚体 API 移动的对象,不受力的作用,但是想要进行碰撞检测
Static 静态刚体:不动不受力作用的静态物体,但是想要进行碰撞检测
代码控制
Rigidbody2D rigid = this.gameObject.GetComponent<Rigidbody2D>();//加力 rigid.AddForce(new Vector2(0,100));//速度rigid.velocity = new Vector2(1,0);
碰撞器
碰撞器是用于在物理系统中 表示物体体积的(形状或范围)
刚体通过得到碰撞器的范围信息进行计算
判断两个物体的范围是否接触
如果接触 刚体就会模拟力的效果产生速度和旋转
2D碰撞器
圆形碰撞器
Material: 一种物理材质,用于确定碰撞的属性,控制摩擦和弹性
Is Trigger: 是否是触发器
Used By Effector: 是否被附加的 2D 效应器使用
Offset: 圆心偏移位置
Radius: 圆形的半径
盒状碰撞器
Used by Composite: 如果勾选,则该碰撞器将附加到 2D 复合碰撞器中使用勾选后,将消失一些属 性,这些属性将在复合碰撞器中配置
Auto Tiling: 如果经理渲染器组件的 Draw Mode 设置为 Tiled 平铺模式,勾选该选项后,当改变精灵 大小时将自动更新碰撞器的尺寸
Size: 矩形的宽高
Edge Radius: 使四个顶点为圆角
多边形碰撞器
Points: 多边形顶点虽然可以手动修改,但是一般情况下 我们通过数值编辑太复杂了都通过 Edit Collider 编辑,或者让 Unity 自动识别创建
边界碰撞器
边界碰撞器的编辑主要还是通过Edit Collider 一般不会手动去通过数值加点
胶囊碰撞器
Size:胶囊的宽高
Direction:是竖直胶囊还是水平胶囊
复合碰撞器
Geometry Type: 几何学类型,合并碰撞体时,碰撞体顶点将组合为两种不同的几何体类型
Outlines: 空心轮廓,类似边界碰撞器
Polygons: 实心多边形,类似多边形碰撞器
Generation Type: 生成类型,复合碰撞器在何时生成新几何体
Synchronous: 对 2D 复合碰撞器或使用的其它碰撞器修改时,Unity 立即生成新几何体
Manual: 手动生成新几何体,通过代码生成或者点击下发的
Regenerate Geometry 生成按钮V
ertex Distance: 从复合碰撞器收集顶点时允许的最小间距值
给父对象添加Composite Collider 2D
代码控制
//碰撞器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){//正在接触}
物理材质
物理材质是用于决定在物体产生碰撞时这些物体之间的摩擦和弹性表现的
通过物理材质我们可以做出类似 斜坡不滑落,小球反弹等效果
【Project】右键创建【Physics Material 2D】
Friction:摩擦系数,为 0 表示没有摩擦力
Bounciness:反弹程度。0 表示没有弹力,1 表示完美弹力(没有能量损失一直弹)
恒定力
恒定力是一个特殊的脚本
它可以给一个 2D 刚体持续添加一个力
在做一些随着时间推移而加速的对象时很适用
比如类似火箭发射等效果
恒定力脚本会线性的为对象添加力和扭矩力 让其移动和旋转
Force:物理更新时施加于 2D 刚体上的线性力
Relative Force:物理更新时施加的线性力(相对刚体对象坐标系)
Torque:物理更新时施加于 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 游戏当中的平台或可往上跳跃的墙壁
Rotational Offset: 旋转偏移量,控制平台角度偏移
Use One Way: 是否使用单向碰撞行为
Use One Way Grouping: 当平台式有多个碰撞器组合时,可以通过它将所有碰撞器设置为单向碰撞行为
Surface Arc: 以局部坐标系下向上的方向为中心,填写一个角度值,定义不允许通过的表面,该角度外的其它地方视为单向碰撞
Use Side Friction: 是否应该在平台两侧使用摩擦
Use Side Bounce: 是否应该在平台两侧使用弹性
Side Arc: 用于定义左右两侧平台的响应弧度
表面效应器
主要作用:模拟传送带
Speed:表面保持的速度
Speed Variation:速度的随机增加值。
Force Scale:缩放沿表面移动时施加的力。如果是 0 表示不加力,相当于禁用。值越低越慢,值越高越快,建议不要设置为 1,因为当设置为 1 时可能会把附加在物体上的其它力,比如跳跃时的力
Use Contact Force:是否对接触物体表面的点施加力,如果选择会让对象旋转,如果不开启则不会旋转
Use Friction:是否使用摩擦力
Use Bounce:是否使用弹力