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. 关门和开门

* 使用弹性

![image.png](/upload/2022/10/image-396707bf37dc447e9cc518bb30ce8198.png)

* 使用马达

![image.png](/upload/2022/10/image-c83df8a1f8be4376be557574f346b3af.png)

### 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 弹性关节

布料