第二十五章 Unity 刚体Rigidbody

这篇具有很好参考价值的文章主要介绍了第二十五章 Unity 刚体Rigidbody。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

第二十五章 Unity 刚体Rigidbody

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

第二十五章 Unity 刚体Rigidbody

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

第二十五章 Unity 刚体Rigidbody

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

第二十五章 Unity 刚体Rigidbody

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

第二十五章 Unity 刚体Rigidbody

 第二十五章 Unity 刚体Rigidbody

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

第二十五章 Unity 刚体Rigidbody

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

第二十五章 Unity 刚体Rigidbody

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” 恒定力组件,如下所示

第二十五章 Unity 刚体Rigidbody

我们只需要取消“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 update
    void Start()
    {
        rbody = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            rbody.AddForce(Vector3.right * 100);
        }
    }
}

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

第二十五章 Unity 刚体Rigidbody

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

第二十五章 Unity 刚体Rigidbody

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

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

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

第二十五章 Unity 刚体Rigidbody

我们发现,当我们施加一个力的时候,球体开始运动,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的阻力值。

第二十五章 Unity 刚体Rigidbody

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

第二十五章 Unity 刚体Rigidbody

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

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

到了这里,关于第二十五章 Unity 刚体Rigidbody的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity - Rigidbody刚体

    1. rigid.MovePosition(targetPosition)        移动到目标位置 调用执行后         1)rigidbody.position 会立即改变,而transform.position并不会立即生效改变         2)transform.position 需要等到下一次的FixedUpdate执行完毕后才会生效改变,即可在LateUpdate中打印看见          Physics.au

    2024年02月07日
    浏览(75)
  • Unity物理组件之刚体Rigidbody

    1、刚体简介 刚体:Rigidbody,属于物理类组件 作用:添加了刚体组件的游戏物体,可以在物体系统的控制下来运动,刚体可接受外力和扭矩力用来保证游戏对象像在真实世界中那样进行运动。任何游戏对象只有添加了刚体组件才能受到重力的影响,通过脚本为游戏对象添加的作

    2023年04月09日
    浏览(82)
  • Unity 关于Rigidbody刚体组件的理解

    一、基本了解 刚体Rigidbody因具体物理相关的属性,使得实际应用中更有真实感。应用也多: Rigidbody它可以受到重力、碰撞或者力的作用,所以我们可以用它模拟物体的真实物理行为,如受到重力的作用、与其他刚体对象进行碰撞,并模拟物体的运动和旋转。 一个带有刚体

    2024年02月03日
    浏览(33)
  • Unity --- 物理引擎 ---- 刚体RigidBody 与 碰撞器 collider

      1.RigidBody(刚体)的作用是让物体具有物理特性(比如说重力,摩檫力等等) 2.如果想让物体能够与其它物体发生碰撞的话,我们还需要一个组件 --- Colider碰撞器组件 1.上图就是Unity中提供的已经准备好的各种形状的碰撞器组件 2.形成不同形状的碰撞器所需的面数不同,面数

    2024年02月16日
    浏览(34)
  • 【正点原子STM32连载】 第二十五章 TFT-LCD(MCU屏)实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

    1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html 前面我们介绍了OLED模块及其显示,但是该模块只能显示单色/双色,不能显示彩色,而且尺寸也较小

    2024年02月11日
    浏览(38)
  • 第二十五节 共享内存

    什么是共享内存?顾名思义,共享内存就是将内存进行共享,它允许多个不相关的进程访问同一个逻辑内存,直接将一块裸露的内存放在需要数据传输的进程面前,让它们自己使用。因此,共享内存是效率最高的一种IPC 通信机制,它可以在多个进程之间共享和传递数据,进程

    2024年02月13日
    浏览(36)
  • 路由器(第二十五课)

    1、路由 1) 什么是路由:路由就是数据包从一个网络到另外一外网络的过程 2)支持路由功能的设备:路由器、三层交换机、防火墙 3 路由器转发数据包的依据: -每一台路由器都维护着一张路由表 -路由器是依靠这张路由表来转发数据的 -这张路由表就类似于我们生活中的地

    2024年02月15日
    浏览(52)
  • 【从零开始学习JAVA | 第二十五篇】泛型

    目录 前言: 泛型: 额外拓展: 总结:         本文将详细介绍之前我们在JAVA 中一直在讲的泛型,各位感兴趣的同学可以点击进来观看。         泛型是一种编程概念, 它允许在定义类、接口或方法时使用类型参数,这样可以在使用时指定实际的类型。 通过使用泛

    2024年02月16日
    浏览(34)
  • 【送书福利-第二十五期】《AI时代系列书籍》

    😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号:程序员洲洲。 🎈 本文专栏:本文收录于洲洲的《送书福利》系列专栏,该专栏福利多多

    2024年02月05日
    浏览(30)
  • 第十五章 Unity 角色移动旋转实例

    本章节我们创建一个“RoleDemoProject”工程,然后导入我们之前创建地形章节中的“TerrainDemo.unitypackage”资源包,这个场景很大,大家需要调整场景视角才能看清。 接下来,我们添加一个人物模型,操作方式就是将模型文件目录复制到“Assets”下 然后Unity会自动同步该文件,我

    2024年02月06日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包