31.Rigidbody刚体代码控制

31.核心系统-物理系统-刚体加力


31.1 知识点

刚体自带添加力的方法

给刚体加力的目标就是让其有一个速度朝向某一个方向移动。

this.GetComponent<Rigidbody>() 获取刚体组件

rigidBody = this.GetComponent<Rigidbody>();

AddForce方法 相对世界坐标添加力

// 向 Rigidbody 添加力。
// 世界坐标系 Z轴正方向加了一个力
// 加力过后 对象是否停止移动 是由阻力决定的 如果阻力为0 那给了一个力过后 始终 是不会停止运动
rigidBody.AddForce(Vector3.forward * 10);

// 如果想要在 世界坐标系方法中 让对象 相对于自己的面朝向动
rigidBody.AddForce(this.transform.forward * 10);

// 如果你希望即使有阻力 也希望对象一直动 那你就一直“推”就行了
// Update内
// rigidBody.AddForce(Vector3.forward * 10);

AddRelativeForce方法 相对本地坐标添加力

// 向刚体添加力(相对于其坐标系)。
rigidBody.AddRelativeForce(Vector3.forward * 10);

AddTorque方法 相对世界坐标添加扭矩力,让其旋转

// 向刚体添加扭矩。
rigidBody.AddTorque(Vector3.up * 10);

AddRelativeTorque方法 相对本地坐标添加扭矩力,让其旋转

// 向刚体添加扭矩(相对于其坐标系)。
rigidBody.AddRelativeTorque(Vector3.up * 10);

velocity变量 刚体速度

// 刚体的速度矢量。它表示刚体位置的变化率。
// 这个速度方向是相对于世界坐标系的 
// 如果要直接通过改变速度 来让其移动 一定要注意这一点
rigidBody.velocity = Vector3.forward * 5;

AddExplosionForce方法 模拟爆炸效果

// 向模拟爆炸效果的刚体施加力。
// 参数:力的大小,中心,半径
// 模拟爆炸的力一定是所有希望产生爆炸效果影响的对象都需要得到他们的刚体来执行这个方法才能都有效果
rigidBody.AddExplosionForce(100, Vector3.zero, 10);

力的几种模式

动量定理

  • Ft = mv

  • v = Ft/m

  • F: 力

  • t: 时间

  • m: 质量

  • v: 速度

ForceMode 力的模式枚举

AddForce方法可以选择第二个参数力的模式,主要的作用就是计算方式不同而已,由于不同计算方式最终的移动速度会不同。

rigidBody.AddForce(Vector3.forward * 10, ForceMode.Acceleration);
Acceleration 加速度模式
  • 给物体增加一个持续的加速度,忽略其质量
  • 向此刚体添加连续加速度,忽略其质量
  • v = Ft/m
    • F: (0,0,10)
    • t: 0.02s
    • m: 默认为1
    • v = 10*0.02/1 = 0.2m/s
    • 每物理帧移动 0.2m/s * 0.02 = 0.004m
Force 力模式
  • 向此刚体添加连续力,使用其质量
  • 给物体添加一个持续的力,与物体的质量有关
  • v = Ft/m
    • F: (0,0,10)
    • t: 0.02s
    • m: 2kg
    • v = 10*0.02/2 = 0.1m/s
    • 每物理帧移动 0.1m/s * 0.02 = 0.002m
Impulse 冲击力模式
  • 向此刚体添加瞬时力冲击,考虑其质量
  • 给物体添加一个瞬间的力,与物体的质量有关,忽略时间,默认为1
  • v = Ft/m
    • F: (0,0,10)
    • t: 默认为1
    • m: 2kg
    • v = 10*1/2 = 5m/s
    • 每物理帧移动 5m/s * 0.02 = 0.1m
VelocityChange 瞬时速度模式
  • 向此刚体添加瞬时速度变化,忽略其质量
  • 给物体添加一个瞬时速度,忽略质量,忽略时间,默认为1
  • v = Ft/m
    • F: (0,0,10)
    • t: 默认为1
    • m: 默认为1
    • v = 10*1/1 = 10m/s
    • 每物理帧移动 10m/s * 0.02 = 0.2m

恒力场组件

搜索组件constant force,给一个cube添加。

修改恒力场组件上面的参数,就不用写代码添加力的效果了,一般做一些想一直保持某种力的效果的东西比较有用。

刚体的休眠

  • Unity为了节约性能,可能会让刚体休眠。
  • 比如让一个有刚体的Cube,受重力影响掉落一个平面上。
  • 当他们静止时,斜向下旋转刚体,这个时候Cube可能不会往下落,因为Cube休眠了。
  • 假如这个时候移动一下平面的位置,Cube可能又会往下落,因为移动平面唤醒了刚体。

IsSleeping方法 获取刚体是否处于休眠状态

if (rigidBody.IsSleeping())
{

}

WakeUp方法 唤醒刚体

获取刚体是否处于休眠状态,如果是,就唤醒它。

if (rigidBody.IsSleeping())
{
    // 就唤醒它
    rigidBody.WakeUp();
}

31.2 知识点代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson31_物理系统之碰撞检测_刚体加力 : MonoBehaviour
{
    Rigidbody rigidBody;
    
    void Start()
    {
        #region 知识点一 刚体自带添加力的方法

        //给刚体加力的目标就是 让其有一个速度 朝向某一个方向移动

        //获取刚体组件
        rigidBody = this.GetComponent<Rigidbody>();

        //AddForce方法 相对世界坐标添加力
        //向 Rigidbody 添加力。
        //世界坐标系 Z轴正方向加了一个力
        //加力过后 对象是否停止移动 是由阻力决定的 如果阻力为0 那给了一个力过后 始终 是不会停止运动
        rigidBody.AddForce(Vector3.forward * 10);
        //如果想要在 世界坐标系方法中 让对象 相对于自己的面朝向动
        rigidBody.AddForce(this.transform.forward * 10);
        //如果你希望即使有阻力 也希望对象一直动 那你就一直“推”就行了
        //Update内
        //rigidBody.AddForce(Vector3.forward * 10);


        //AddRelativeForce方法 相对本地坐标添加力
        //向刚体添加力(相对于其坐标系)。
        rigidBody.AddRelativeForce(Vector3.forward * 10);


        //AddTorque方法 相对世界坐标添加扭矩力,让其旋转
        //向刚体添加扭矩。
        rigidBody.AddTorque(Vector3.up * 10);

        //AddRelativeTorque方法 相对本地坐标添加扭矩力,让其旋转
        //向刚体添加扭矩(相对于其坐标系)。
        rigidBody.AddRelativeTorque(Vector3.up * 10);

        //velocity变量 刚体速度
        //刚体的速度矢量。它表示刚体位置的变化率。
        //这个速度方向 是相对于 世界坐标系的 
        //如果要直接通过改变速度 来让其移动 一定要注意这一点
        rigidBody.velocity = Vector3.forward * 5;

        //AddExplosionForce方法 模拟爆炸效果
        //向模拟爆炸效果的刚体施加力。
        //参数:力的大小,中心,半径
        //模拟爆炸的力 一定是 所有希望产生爆炸效果影响的对象 
        //都需要得到他们的刚体 来执行这个方法 才能都有效果
        rigidBody.AddExplosionForce(100, Vector3.zero, 10);

        #endregion

        #region 知识点二 力的几种模式

        //动量定理
        //Ft = mv
        //v = Ft/m;
        //F:力
        //t:时间
        //m:质量
        //v:速度

        //ForceMode 力的模式枚举
        //AddForce方法 可以选择第二个参 力的模式
        //主要的作用 就是 计算方式不同而已 
        //由于4中计算方式的不同 最终的移动速度就会不同
        rigidBody.AddForce(Vector3.forward * 10, ForceMode.Acceleration);


        //Acceleration 加速度模式
        //给物体增加一个持续的加速度,忽略其质量
        //向此刚体添加连续加速度,忽略其质量。
        //v = Ft/m
        //F:(0,0,10)
        //t:0.02s
        //m:默认为1
        //v = 10*0.02/ 1 = 0.2m/s
        //每物理帧移动0.2m/s*0.02 = 0.004m

        //Force 力模式
        //向此刚体添加连续力,使用其质量。
        //给物体添加一个持续的力,与物体的质量有关
        //v = Ft/m
        //F:(0,0,10)
        //t:0.02s
        //m:2kg
        //v = 10*0.02/ 2 = 0.1m/s
        //每物理帧移动0.1m/s*0.02 = 0.002m

        //Impulse 冲击力模式
        //向此刚体添加瞬时力冲击,考虑其质量。
        //给物体添加一个瞬间的力,与物体的质量有关,忽略时间 默认为1
        //v = Ft/m
        //F:(0,0,10)
        //t:默认为1
        //m:2kg
        //v = 10*1/ 2 = 5m/s
        //每物理帧移动5m/s*0.02 = 0.1m

        //VelocityChange 瞬时速度模式
        //向此刚体添加瞬时速度变化,忽略其质量。
        //给物体添加一个瞬时速度,忽略质量,忽略时间
        //v = Ft/m
        //F:(0,0,10)
        //t:默认为1
        //m:默认为1
        //v = 10*1/ 1 = 10m/s
        //每物理帧移动10m/s*0.02 = 0.2m

        #endregion

        #region 知识点三 恒力场组件

        #endregion
    }
    
    void Update()
    {
        #region 知识点一 刚体自带添加力的方法
        //如果你希望即使有阻力 也希望对象一直动 那你就一直“推”就行了
        //Update内
        //rigidBody.AddForce(Vector3.forward * 10);

        #endregion

        #region 知识点四 刚体的休眠

        //Unity为了节约性能,可能会让刚体休眠
        //比如让一个有刚体的Cube,受重力影响掉落一个平面上
        //当他们静止时,斜向下旋转刚体,这个时候Cube可能不会往下落,因为Cube休眠了
        //假如这个时候移动一下平面的位置,Cube可能又会往下落,因为移动平面唤醒了刚体

        //获取刚体是否处于休眠状态 如果是 
        if (rigidBody.IsSleeping())
        {
            //就唤醒它
            rigidBody.WakeUp();
        }

        #endregion
    }
}

31.3 练习题

现在让一个物体产生位移有几种方式?

  1. 直接在Update生命周期函数中改变Transform当中的Position属性。
  2. 直接在Update生命周期函数中使用Transform提供的API Translate方法。
  3. 通过加力,使用rigidBody.AddForce或rigidBody.AddRelativeForce方法。
  4. 通过改变刚体速度变量,使用rigidBody.velocity = Vector3.forward * 10;


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏