RigidBody2D
刚体就是给物体添加rigidBody组件,让物体具有物体特性(物体受到重力,阻力等)
👀️ RigidBody组件的注意事项
如果你在一个物体上附加了Rigidbody 组件,那么你就不要使用Transform组件去更改此物体的位置和旋转了。我们应该通过 Rigidbody 组件去修改。因为Unity的Transform组件在移动的之后,还要去更新Collider组件的位置,然后进行重新的计算。
如果你去使用Rigidbody2D组件去移动一个游戏对象,那么这个游戏对象以及子游戏对象上的Collider2D组件也会跟着移动
添加碰撞Collider,优先选择Box Collider
Mesh Collider最接近碰撞检测,但是确实十分消耗性能的碰撞,如果点击Convex,unity会尽量的把这些面和点合并
碰撞原理
如果刚体A与不是刚体的物体B碰撞,则
A撞B, A会受到力的效果, B不会动
B撞A, 直接穿过去了,没有任何效果
原理:A动了,会实时监测碰撞效果,如果A不动,就会进入休眠状态,不会去监测碰撞效果。
组件参数 Body Type=Dynamic
主要用于在物理模拟下运动。他会受到重力和力的影响。他经常用于物体的移动,但是消耗性能是最大的(与其他Body Type)
使用Dynamic模式,不要使用Transform组件来移动物体,请使用RigidBody2D去移动物体(通过施加力或者发生碰撞的方式)
Material:在刚体上设置物理材质。如果子物体有碰撞器但没有设置材质,则会使用刚体组件上的物理材质。
如果刚体上没有设置物理材质,会使用Physics2D窗口中的默认材质
Simulated:如果勾选了它,则2D刚体以及所有子对象2D碰撞器和2D关节都能够模拟物理效果
Use Auto Mass:如果勾选它,则Unity会通过内部算法自动计算该对象的质量
Mass:这个值将定义Rigidbody 2D的质量。 如果您勾选了Use Auto Mass字段,则Mass字段将变灰(不可选)
Linear Drag:影响位置移动的阻力系数
Angular Drag:影响旋转运动的阻力系数
Gravity Scale:受重力影响的程度。
Collision Detection:定义如何检测碰撞2D之间的碰撞
Discrete:离散的,如果设置了这种方式,会出现一个问题:如果物体移动速度足够快,则在physicsupdate(物理更新)期间让具有Rigidbody2D和Collider2D的GameObjects可以重叠或通过彼此。(且碰撞接触只在新的位置产生)比如:如果一个人跑得太快,就会出现穿墙的可能
Continuous:连续的。在physics update(物理更新)期间不会相互穿透相反。
Sleeping Mode:自定义对象在休眠时如何“休眠(Sleeping)”。休眠可以节省处理器时间。
NeverSleep:永不休眠(会影响系统资源)
StartAwake: 开始时醒着。对象最初是清醒的
Start Asleep:开始时睡着(可以通过碰撞被唤醒)
Interpolate:物理更新间隔之间的差值运算
None:无平滑
Interpolate:根据上一帧 进行平滑的过渡
Extrapolate:根据下一帧 进行平滑的过渡
Constraints:定义对Rigidbody 2D运动的限制(位移限制和旋转限制)
组件参数 Body Type=Kinematic
运动学类型,不受力的影响,只能通过代码(Rigidbody2D.MovePosition和Rigidbody2D.MoveRotation方法,来进行位移和旋转)让其动起来
Use Full Kinematic Contacts:启用它后,可以和所有的2D刚体碰撞。不启用它,它不会和Kinematic2D和Static 2D刚体碰撞
组件参数 Body Type=Static
任何一个物体与他碰撞。自身都不会动(好像有无限的质量)
RigidBody2D类的 Velocity属性的研究
当我给Velocity设置一个值时,那么物体将会始终存在一个速度。这个物体也会通过速度去移动
public class 刚体运动 : MonoBehaviour
{
Rigidbody2D rb;
private void Start()
{
rb = GetComponent<Rigidbody2D>();
rb.velocity = new Vector2 (0, 1);
}
}
力的模式
力的模式 主要的作用 就是 计算方式不同而已,由于4种计算方式的不同 最终的移动速度就会不同
rigidBody.AddForce(Vector3.forward * 10, ForceMode.Acceleration);
ForceMode.Force:力等于质量乘以加速度。这意味着力会逐渐增加刚体的速度
效果:力的作用是持续的,随着时间的推移,刚体会逐渐加速。如果你施加一个恒定的力,刚体会不断加速,直到受到其他力(如摩擦力或阻力)的影响
ForceMode.Acceleration:物体增加一个持续的加速度,忽略其质量(质量为1)
不论刚体的质量是多少,它都会以相同的速度变化。这种模式适合于需要忽略质量差异的情况
ForceMode.Impulse:类似于瞬间给予物体一个巨大的推动力
刚体会立即获得一个新的速度,但不会继续加速。这相当于给物体一个“踢”或“击打”,使其瞬间移动。
BoxCollider2D
任何的碰撞现象都有两个载体,一个是发起碰撞的,另一个是接受碰撞的,所以我们首先要明确哪些物体是可以接受碰撞的。
碰撞产生的必要条件是
两个物体都有碰撞器
至少有一个物体有刚体
当我们给一个GameObject添加了一个Collider组件之后,就相当于将它在游戏世界中实体化了,它有体积,有位置,可以阻挡同样有体积的物体运动。
刚体会利用体积进行碰撞计算,模拟真实的碰撞效果,产生力的作用
👀️ 刚体对象的子对象碰撞信息参与碰撞检测。
就是说一个父物体是由多个子物体构成,每个子物体都有碰撞体,只需要给父物体添加刚体,那么所有带有父物体的子物体都会参与碰撞
Circle Collider 2D组件
Material:物理材质,用于确定碰撞的属性,控制摩擦和弹性
Is Trigger:设置该属性后,碰撞体就会变成触发器,当与别的碰撞体发生碰撞后,就把触发OnTriggerEnter2D函数。(如果要触发OnTriggerEnter2D必须要挂载rigidBody2D组件)
Used By Effector:是否被附加的2D效应器使用。下文会细说。
Offset:圆心偏移位置
Radius:圆形的半径
Box Collider 2D组件
Used by Composite:结合复合碰撞器使用
Auto Tiling:如果将渲染器组件的Draw Mode设置为Tiled平铺模式,勾选它,当改变精灵大小时,会自定更新碰撞器的尺寸
Size:矩形的宽高
Edge Radius:使四个顶点为圆角。(其他物体碰撞四个角时,有一种往下滑的感觉)
Composite Collider 2D组件
将多个碰撞体合并为一个新的碰撞体。
首先需要一个空物体挂载Composite Collider 2D组件,其子物体的碰撞体必须勾选Used by Composite。
Geometry Type:几何学类型,合并碰撞体时,碰撞体顶点将组合为两个不同的几何体类型。
Outliness:空心轮廓。类似于一个大的水壶,如果将一个小球放进水壶中,小球很难出来。
Polygons:实心多边形。灌满了水泥的水壶,无法把小球放进水壶中
Generation Type:生成类型
Synchornous:当改变多个碰撞体下的某个碰撞体位置时,Unity会立刻生成新的几何体
Manual:只有当点击Regenerate Geometry按钮,才会生成新的几何体
Vertex Distance:从复合碰撞器手机顶点时允许的最小间距。
BoxCollider2D类中的Bounds
Bounds代表了物体的外包矩形,也就是包围盒。它是在x、y、z三个方向上的长度,代表了物体的大小。这个包围盒可以用于检测物体之间的碰撞。
public Collider2D gameArea;
// 获取这个碰撞体的区域
Bounds bounds = gameArea.bounds;
2D物体材质
Friction:摩擦系数,为0表示没有摩擦力
Bounciness:反弹程度。0表示没有弹力,1表示完美弹力(没有能量损失,一直弹)
恒定力
Force:物理更新时施加于2D刚体上的线性力
Relative Force:物理更新时施加的线性力(相对于刚体对象坐标系)
Torque:物理更新时施加2D刚体的扭矩力
效应器
2D效应器配合2D碰撞器一起使用,可以让游戏对象在相互接触时产生一些特殊的物理作用力
类似:传送带、互斥、吸引、漂浮、单向碰撞等等效果
Area Effector 2D区域效应器
注意:必须有碰撞体,并且勾选了触发器
在一个区域内让游戏对象受到力和扭矩的作用
Use Collider Mask:勾选它后,会通过Collider Mask来选择指定层,决定效应器只会作用于那些层的对象
Use Global Angle:勾选它后,使用世界坐标系下的角度
Force Angel:施加力的角度
Force Magnitude:施加力的大小
Force Variation:施加力的随机大小变换
Force Target:效应器在目标对象的作用点
Collider:以碰撞器的当前位置
Rigiboody:以刚体的当前质心
关节
### 铰链关节
* 铰链关节由两个刚体组成,约束它们像连在一个铰链上一样运动,适用于门,不过对于典型的链子、钟摆等同样适用。
* 添加该组件前必须先添加Box Collider、Rigidbody两个组件
| 属性: | 功能: |
| ---------------- | -------------------------------------------------------------- |
| Connected Body | 对关节所依赖的刚体的引用(可选)。如果未设置,则关节连接到世界 |
| Anchor | 连接体围绕摆动的轴位置。该位置在局部空间中定义。 |
| Connected Anchor | 手动配置连接锚点位置。 |
| Spring | 在启用 Use Spring 的情况下使用的弹簧的属性。 |
### 1. 关门和开门
* 使用弹性

* 使用马达

### 2. 把门撞飞效果
```language
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 撞门
/// </summary>
public class DoorForce : MonoBehaviour
{
private void OnCollisionStay(Collision collision)
{
if(collision.collider.tag == "Door")
{
collision.rigidbody.AddForce((Vector3.forward + Vector3.up) * 500);
}
}
}
```
### Fixed Joint
### Spring Joint 弹性关节
评论区