Unity 基础 之 使用刚体

725 阅读2分钟

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

概念

向对象添加 Rigidbody 组件后,其运动将受到 Unity 物理引擎的控制。即使不添加任何代码,Rigidbody 对象也受到向下的重力,并在与其他对象碰撞时作出反应(如果也存在适当的 Collider 组件)。

Rigidbody 还有一个脚本 API,让您能够向对象施加力,并以逼真的物理效果对其进行控制。例如,可以根据车轮施加的力来指定汽车的行为。根据这些信息,物理引擎可以处理汽车运动的大多数其他方面,因此汽车可进行逼真的加速并适当地响应碰撞。


公共方法

公共函数解释说明
AddExplosionForce向模拟爆炸效果的刚体施加力。
AddForce向 Rigidbody 添加力。
AddForceAtPosition在 position 处施加 force。这将向对象施加扭矩和力。
AddRelativeForce向刚体添加力(相对于其坐标系)。
AddRelativeTorque向刚体添加扭矩(相对于其坐标系)。
AddTorque向刚体添加扭矩。
ClosestPointOnBounds与附加碰撞体的包围盒最接近的点。
GetPointVelocity点 worldPoint(全局空间)处刚体的速度。
GetRelativePointVelocity相对于点 relativePoint 处的刚体的速度。
IsSleeping刚体是否处于睡眠状态
MovePosition将刚体移动到 position。
MoveRotation将刚体旋转到 rotation。
ResetCenterOfMass重置刚体的质心。
ResetInertiaTensor重置惯性张量的值和旋转。
SetDensity根据附加的碰撞体设置质量(假设密度恒定)。
Sleep强制刚体进入睡眠状态至少一帧。
SweepTest测试如果刚体在场景中移动时,是否会与任何对象发生碰撞。
SweepTestAll与 Rigidbody.SweepTest 类似,但返回所有命中对象。
WakeUp强制唤醒刚体。

代码解释

四种模式:

  1. ForceMode.Force:给物体一个持续的力
  2. ForceMode.Acceleration:给物体一个持续的加速度,但是忽略其质量,质量被默认为1
  3. ForceMode.Impulse:给物体添加一个瞬间的力
  4. ForceMode.VelocityChange:给物体添加一个瞬间的加速度,忽略其质量

函数:

  • 添加一个力到刚体,参考世界坐标
AddForce (force : Vector3, mode : ForceMode = ForceMode.Force)
  • 添加一个力到刚体,参考本地坐标
AddRelativeForce (force : Vector3, mode : ForceMode = ForceMode.Force) 
  • 添加一个力矩到刚体,参考世界坐标
AddTorque (torque : Vector3, mode : ForceMode = ForceMode.Force)
  • 添加一个力矩到刚体,参考本地坐标
AddRelativeTorque (torque : Vector3, mode : ForceMode = ForceMode.Force)
  • 说明在有阻力的作用下,物体会慢慢停下,在position位置应用force力。作为结果这个将在这个物体上应用一个力矩和力(瞬时)。
AddForceAtPosition (force : Vector3, position : Vector3, mode : ForceMode = ForceMode.Force)

代码示例

using UnityEngine;

public class RigidbodyTest : MonoBehaviour
{
    public Rigidbody rb;

    void Start()
    {
        // 获取刚体组件
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        // 持续添加力
        rb.AddForce(transform.forward * 10);
    }
}