第二十五章 Unity 刚体Rigidbody

article/2025/10/19 15:47:32

在物理学中,静止和匀速直线运动是物体的平衡状态,如果给该物体施加某一个力的话,物体的平衡状态就会改变,当然这个真理的前提是理想状态。我们知道在现实世界中,由于重力和摩擦力的存在,任何一个物体都不可能永无止境的运动下去。因此,要想让物体保持运动状态,我们就必须持续的给物体施加一个力。在Unity中就模拟了这种效果,它是通过一个叫做“Rigidbody刚体”的组件实现的。接下来,我们就来创建一个“PhysicsDemo”3D工程来介绍Rigidbody刚体组件。

首先,我们创建了一个平面,然后在平面的上方创建了一个球体。

接下来,我们就给球体添加刚体Rigidbody组件。添加操作非常简单,可以在球体的Inspector检视视图下面点击“Add Component”。

我们在搜索框中输入“ri”,就会在下拉框中就能看到“Rigidbody”组件,注意不要选择“Rigidbody 2D”,这个虽然也是刚体,但是它是用于2D游戏对象的。我们是这里要选择的是3D的“Rigidbody”组件。

在“Rigidbody”刚体组件下有很多参数,我们暂时先不介绍,直接运行工程来查看添加刚体组件后的球体会有什么效果。如下所示:

运行后,我们发现球体直接落到了平面上面。这是因为,给球体添加刚体组件后,球体就会受到“重力”的作用,沿着Y轴方向向下掉落,直到碰到平面而停止。这个“重力”就是“Rigidbody”刚体组件产生的效果。刚体会接管附加到的游戏对象的运动,如果我们施加一个力来推动游戏对象的话,Unity会自动计算该游戏对象的运行效果。如何施加一个力呢?我们点击菜单栏“Component”->“Physics”->“Constant Force” 恒定力组件。

 

我们在“Constant Force” 恒定力组件的Force参数的X值修改为2,也就是在X轴方向上施加数值为2的一个力来作用于当前球体。我们运行工程,查看效果。

我们发现球体受到重力作用掉落后,还同时受到X轴方向的力而向右继续运动。但是,有时候我们不希望游戏物体以这样的方式运行,因此我们需要游戏对象的运动摆脱Unity物理引擎的控制。刚体组件有一个名为 Is Kinematic 的属性,该属性可以让刚体摆脱物理引擎的控制,并允许通过脚本以运动学方式来移动刚体。接下来,我就来讲解刚体的一些参数。

Mass             游戏对象的质量(默认单位为千克)。

Drag              游戏对象移动时受到阻力的大小,0 表示没有阻力。

Angular Drag  游戏对象旋转时受到阻力的大小,0 表示没有角阻力。

Use Gravity    如果启用此属性,则对象将受重力影响。默认是启用状态。

Is Kinematic   如果启用此选项,则对象将不会被物理引擎驱动,上文中已经提到。

Interpolate      仅当在刚体运动中看到抖动时才尝试使用提供的选项之一。

                        - None    不应用插值。

                        - Interpolate   根据前一帧的变换来平滑变换。

                        - Extrapolate  根据下一帧的估计变换来平滑变换。

Collision Detection 用于防止快速移动的对象穿过其他对象而不检测碰撞。

Discrete为默认值,表示对场景中的所有其他碰撞体使用离散碰撞检测。

Constraints     对刚体运动的限制,可以限制在X/Y/Z某一轴向上移动或旋转。我们展开下面有两个子项,分别是冻结位置和冻结旋转,每一个冻结子选项都分为X,Y,Z三个轴向的冻结。如果当刚体操作游戏物体运动的时候,不会在这些轴向上产生移动或旋转。

在上面的案例中,我们使用“Constant Force” 恒定力组件给球体施加一个力,让其产生运动。如何使用脚本来使用刚体控制物体运动,或者说如何使用脚本给游戏对象施加一个力呢?首先,我们先取消“Constant Force” 恒定力组件,如下所示

我们只需要取消“Constant Force”组件前面的勾选项即可。接下来,我们创建一个脚本SphereScript.cs,然后附加到球体上面,代码如下所示

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class SphereScript : MonoBehaviour
{// 刚体组件private Rigidbody rbody;// Start is called before the first frame updatevoid Start(){rbody = GetComponent<Rigidbody>();}// Update is called once per framevoid Update(){if (Input.GetKeyDown(KeyCode.A)){rbody.AddForce(Vector3.right * 100);}}
}

上述代码就是,当我们按下键盘A键的时候,使用刚体的AddForce方法给球体施加一个Vector3.right方向,大小为100。这里需要注意的是,AddForce施加的力在 FixedUpdate 中计算,而FixedUpdate时间间隔一般是0.02秒。代码完成之后,我们还需要做一个非常关键的设置,就是取消Use Gravity,如下所示

这样,球体就不再受重力影响掉落到平面上面了。我们可以Play运行一下。

我们发现,球体不再掉落下来,并且当我们按下A键的时候,球体向右开始移动。我们知道,移动的物体,最重要的是速度。当我们给物体施加一个力的时候,这个速度与力的关系是如何呢?我们修改一下代码,打印刚体的速度velocit 值。

    // Update is called once per framevoid Update(){if (Input.GetKeyDown(KeyCode.A)){rbody.AddForce(Vector3.right * 100);}Debug.Log(rbody.velocity);}

我们增加一个日志,输出游戏物体的速度。我们重新Play工程

我们发现,当我们施加一个力的时候,球体开始运动,X轴向速度是2.0。这个数值是怎么计算得来的呢?首先了解一下动量定理:物体在一段时间Δt内的动量变化量等于它在这个过程中所受力的冲量,也就是力与力的作用时间的乘积,数学表达式为:FΔt = mΔv 。其中F就是这个力的大小,Δt就是这段时间,m就是物体的质量,Δv表示这段时间的平均速度。我们球体对象的质量mass为1(在Rigidbody组件中设置的),然后给它一个X轴正方向大小为100的力。AddForce方法还有第二个参数ForceMode,代表施加力的类型。ForceMode为枚举类型,有4个枚举成员:ForceMode.Force,ForceMode.Acceleration,ForceMode.Impulse,ForceMode.VelocityChange。

他们代表的含义如下所示:

ForceMode.Force 默认方式,使用刚体的质量计算,以每帧间隔时间为单位计算动量。我们上面已经说了FixedUpdate按0.02s秒计算,则由动量定理公式FΔt = mΔv可得, 速度v =  FΔt / m = 100 * 0.02 / 1 = 2.0米/秒。也就是说,刚体1秒移动2米的距离。

ForceMode.Acceleration表示忽略游戏对象的质量(相当于质量固定为1)。

ForceMode.Impulse 表示采用瞬间力作用方式,即把Δt的值默认为1,速度会变快。

ForceMode.VelocityChange 表示忽略质量和时间(两者均固定为1),速度就更加快了。

最后,我们要讲解一下刚体的阻力Drag值。在现实世界中,物体移动一定会受到阻力的影响,其速度会慢慢减少,最终停止运动。在Unity中,为了能够让物体运动一段距离后停止,我们可以给刚体组件增加阻力Drag值。接下来,我们给刚体增加1的阻力值。

然后,我们在重新Play工程,查看日志中速度的变化。

我们发现,刚体的速度从2.0开始依次减少0.1的速度。阻力与速度之间的公式是什么呢?网上查询了PhysX得知:velocity = velocity * ( 1 - deltaTime * drag); 也就是说,速度会随着每帧的执行,越来越小,直到为零。假如阻力为1的话,游戏对象会在运动1秒后速度减小到零(静止不动)。也就是说,不管施加的力有多大,当阻力为1的时候,游戏对象都会在1秒后静止。但是,从我们实际的运行情况来看,好像也没有那么的准确。而且,如果发生碰撞的话(球体在平面上),速度也会不断减少。

我们总结一下:刚体可以接受力和扭矩,力可以让刚体对象移动,扭矩可以让刚体对象旋转,向刚体施加力/扭矩实际上会改变对象的变换组件的位置和旋转。我们可以通过刚体的AddForce或AddTorque方法来给游戏对象添加力或者扭矩。但是,在实际开发中,我们可能取消Use Gravity重力影响,勾选Is Kinematic属性,使用代码控制游戏对象平移或旋转变换。两者各有各的优势,刚体可以模拟现实世界的运动效果,而代码控制更加灵活。并且,刚体组件一般都是搭配碰撞体组件一起使用的。另外,当处于休眠模式的刚体收到外界的影响时候,刚体会被唤醒,继续参与物理运算。如果希望通过脚本来控制刚体的休眠状态,可以调用刚体的Sleep和WakeUp方法让刚体进入休眠或者从休眠中唤醒。


http://chatgpt.dhexx.cn/article/9caPUWIE.shtml

相关文章

Unity:使用RigidBody

There are mainly two ways of moving a gameObject in Unity: 在Unity中移动游戏对象的方式主要有两种&#xff1a; Changing Position Coordintes: By directly changing the position of a gameObject without much consideration to its physics or other such components…

Rigidbody刚体组件详解

【组件界面】 【作用】 有刚体组件的物体受物理引擎控制&#xff0c;表现得像物理世界中的物体&#xff0c;例如受重力作用、受摩擦力推力等各种力作用、遇到墙会停下来不能穿过去。在Unity中&#xff0c;若某物体不带有碰撞器&#xff0c;仍会被穿过。碰撞器的作用在于检测空…

Unity API详解——Rigidbody类

Rigidbody类的功能是用来模拟GameObject对象在现实世界中的物理特性&#xff0c;包括重力、阻力、质量、速度等。对RIgidbody对象属性的赋值代码通常放在脚本的OnFixedUpdate()方法中。本博客主要介绍Rigidbody类的一些实例属性和实例方法&#xff0c;最后对Rigidbody类中功能相…

Unity 3D 刚体(Rigidbody)|| Unity 3D 刚体实践案例

Unity 3D 中的 Rigidbody 可以为游戏对象赋予物理特性&#xff0c;使游戏对象在物理系统的控制下接受推力与扭力&#xff0c;从而实现现实世界中的物理学现象。 我们通常把在外力作用下&#xff0c;物体的形状和大小&#xff08;尺寸&#xff09;保持不变&#xff0c;而且内部…

【Unity3D】刚体组件Rigidbody

1 前言 刚体&#xff08;Rigidbody&#xff09;是运动学&#xff08;Kinematic&#xff09;中的一个概念&#xff0c;指在运动中和受力作用后&#xff0c;形状和大小不变&#xff0c;而且内部各点的相对位置不变的物体。在 Unity3D 中&#xff0c;刚体组件赋予了游戏对象一些运…

【Unity】11.2 刚体(Rigidbody)

分类&#xff1a;Unity、C#、VS2015 创建日期&#xff1a;2016-05-02 一、简介 Rigidbody&#xff08;刚体&#xff09;组件可使游戏对象在物理系统的控制下来运动&#xff0c;刚体可接受外力与扭矩力&#xff0c;使游戏对象像在真实世界中那样进行运动。 任何游戏对象&…

【Physics】一、Rigidbody 刚体

文章目录 1、刚体组件2、刚体脚本2.1、获取刚体2.2、添加力2.3、Move 点击访问官网 物理系统 、刚体概述 、 刚体 (Rigidbody) 1、刚体组件 刚体 (Rigidbody) 使游戏对象的行为方式受物理控制。刚体可以接受力和扭矩&#xff0c;使对象以逼真的方式移动。任何游戏对象都必须包…

Unity物理组件之刚体Rigidbody

一、刚体组件简介 1、刚体简介 刚体&#xff1a;Rigidbody,属于物理类组件 作用&#xff1a;添加了刚体组件的游戏物体&#xff0c;可以在物体系统的控制下来运动&#xff0c;刚体可接受外力和扭矩力用来保证游戏对象像在真实世界中那样进行运动。任何游戏对象只有添加了刚体…

【Untiy学习笔记】Rigidbody组件及其常用函数

前言 提示&#xff1a;声明&#xff1a;此篇文章是个人学习笔记&#xff0c;并非教程&#xff0c;所以内容可能不够严谨。可作参考&#xff0c;但不保证绝对正确。如果你发现我的文章有什么错误&#xff0c;非常欢迎指正&#xff0c;谢谢哦。 本文大部分内容来自官方文档&…

mac快速锁屏方法

方法一. 快捷键&#xff1a;controlcommandQ。 方法二. 点击左上角apple logo&#xff0c;锁定屏幕。 方法三&#xff08;快捷方便&#xff09;. 系统偏好设置->调度中心->触发角->选一个角&#xff08;左上、左下、右上、右下&#xff09;->锁定屏幕或者将显示器…

mac修改cmd+ctrl+q锁定屏幕快捷键

mac里的cmdctrlq快捷键是系统快捷键&#xff0c;用作“锁定屏幕”&#xff1a; 这个快捷键优先级很高&#xff0c;导致无法设置其为其他应用快捷键&#xff08;如qq&#xff09;。 下面的方法可以把“锁定屏幕”改成其他快捷键&#xff0c;从而腾出cmdctrlq来给应用程序&#…

mac 设置mysql登录快捷键_史上最详细的苹果Macbook快捷键使用

电脑快捷键可以帮助你提高工作效率&#xff0c;是使用电脑过程中经常用到的&#xff0c;苹果电脑的快捷键和普通PC不太一样&#xff0c;对于新手来说&#xff0c;经常找不到或不知道快捷键是什么&#xff0c;经常要去查&#xff0c;所以这边系统城小编跟大家介绍macbook快捷键的…

Mac提高效率的快捷键

分享常用的一些快捷键&#xff0c;欢迎补充&#xff0c;一起提高办公效率 目录 常用按键介绍系统管理关机和睡眠偏好设置触摸板、键盘和鼠标 窗口管理&#xff08;最小化、关闭、退出&#xff09;目录&#xff08;文件夹&#xff09;文本和文件操作撤销、重做复制、剪切全选查找…

mac系统修改锁屏快捷键

mac 自带了锁屏的快捷键&#xff0c;我忘了是什么了,点击屏幕左上角的苹果图标&#xff0c;就能看到。反正比较麻烦&#xff0c;没windows下方便&#xff0c;。 习惯了在windows下&#xff0c;按winL键来锁屏。在mac下&#xff0c;怎么改成commandL来锁屏呢&#xff1f; 方法…

macbook 常用键盘快捷键大全 mac os 苹果电脑

为了让刚开始使用 Mac 的新手更快地上手&#xff0c;特整理了这一份“最值得你记住的 Mac 常用快捷键列表”&#xff0c;希望可以帮助到大家更快地学习和查找 macOS 的键盘快捷键&#xff0c;以此提高 Mac 的操作效率…… 与 Windows 的差异 一切开始前&#xff0c;我们先来认识…

mac键盘快捷键大全

macos下都有哪些Mac 键盘快捷键呢?不少果粉抱怨高上大的macbook不好用,相比于之前习惯了Windows操作的用户们,转战到mac的阵营还真是会觉得不大习惯呢。觉得不好用的朋友很可能就在于你不知道mac的这些快捷键呐,下文小编就为大家整理好mac的一些常用快捷键,需要的朋友快去…

MacOS VSCode 常用快捷键配置

&#x1f4cc; 2023-03-28 更新 VSCode 回到上一步光标位置 &#xff08;macOS&#xff09;默认快捷键&#xff1a; 回退上一次编辑&#xff1a;ctrl - 跳转下一次编辑位置&#xff1a;ctl shift - &#xff08;建议修改&#xff09;修改快捷键&#xff1a; 快捷键中搜索…

MAC OS常用快捷键一览

切换输入法&#xff1a;Cmd Space 截屏&#xff1a;Shift Cmd 3 部分截屏&#xff1a;Shift &#xff0b; Cmd &#xff0b; 4 屏幕反色快捷键&#xff1a;Option &#xff0b; Cmd &#xff0b; F5 &#xff08;需要勾选反色选项&#xff09; 复制/剪切/粘贴/全选&#xff…

Mac 键盘快捷键

Mac 键盘快捷键 您可以按下某些组合键来实现通常需要鼠标、触控板或其他输入设备才能完成的操作。 要使用键盘快捷键,请按住一个或多个修饰键,然后按快捷键的最后一个键。例如,要使用 Command-C(拷贝),请按住 Command 键并按 C 键,然后同时松开这两个键。Mac 菜单和键…

苹果mac休眠快捷键_Mac电脑睡眠、退出登录和关机快捷键有哪些?技巧来啦!

有很多刚开始使用&#xff0c;甚至一些使用了很久Mac系统的人&#xff0c;可能不知道关机快捷键&#xff0c;只能通过点击屏幕左上角的苹果&#xff0c;然后选择其中的“关机”(Shut Down)&#xff0c;然后在弹出的对话框中点击确认&#xff0c;才能实现整个关机的过程&#xf…