Unity中Rigidbody 刚体组件和Rigidbody类是什么?

Rigidbody 刚体组件

Rigidbody 是 Unity 中的一个组件,它可以让你的游戏对象像真实世界中的物体一样移动和碰撞。想象一下,你有一个小球,你希望它像真实世界中的球一样滚动、弹跳和碰撞,那么你就可以给这个小球添加一个 Rigidbody 组件。

为什么要用 Rigidbody?

当你给一个游戏对象添加 Rigidbody 组件后,Unity 的物理引擎就会接管这个对象的运动。即使你不写任何代码,这个对象也会受到重力的影响,向下掉落,并且当它碰到其他物体时会发生碰撞。

比如,你有一个小球和一个地板,如果你给小球添加了 Rigidbody 组件,小球就会掉到地板上,并且会弹起来。

如何控制 Rigidbody?

Rigidbody 还提供了一个编程接口(API),让你可以通过代码来控制对象的运动。比如,你可以通过施加力来让小球滚动,或者通过施加扭矩来让它旋转。

举个例子,如果你想让一辆汽车在游戏中移动,你可以通过编程来模拟车轮施加的力。有了这些信息,Unity 的物理引擎就可以处理汽车的其他运动,比如加速和碰撞。

什么时候使用 FixedUpdate?

在编写代码时,建议在 FixedUpdate 函数中应用力和更改 Rigidbody 的设置,而不是在 Update 函数中进行。这是因为物理更新是以固定的时间步长进行的,与帧更新不一致。FixedUpdate 在每次物理更新之前立即调用,因此在那里进行的任何更改都会直接处理。

常见问题:为什么物理看起来像慢动作?

初学者在使用 Rigidbody 时常见的一个问题是游戏物理看起来像是在“慢动作”中运行。这实际上是由于模型的比例问题。默认的重力设置假设一个世界单位对应一米的距离。在非物理游戏中,如果你的模型都是 100 个单位长,这不会有太大影响,但在使用物理时,它们将被视为非常大的对象。如果使用大比例的对象,它们会显得下落非常缓慢——物理引擎认为它们是非常大的物体在非常大的距离上落下。因此,请确保你的对象与现实生活中的比例大致相同(例如,一辆车大约应该是 4 个单位 = 4 米)。

 

关于这个组件对应的Rigibody类 

Rigidbody 类 的属性

  • angularDrag: 对象的角阻力。

  • angularVelocity: 刚体的角速度矢量,以每秒弧度为单位。

  • centerOfMass: 相对于变换原点的质心。

  • collisionDetectionMode: 刚体的碰撞检测模式。

  • constraints: 控制模拟此刚体时允许的自由度。

  • detectCollisions: 是否启用碰撞检测(默认情况下始终启用)。

  • drag: 对象的阻力。

  • freezeRotation: 控制物理是否会更改对象的旋转。

  • inertiaTensor: 此刚体的惯性张量,定义为在刚体质心位置和旋转的参考系中的对角矩阵。

  • inertiaTensorRotation: 惯性张量的旋转。

  • interpolation: 插值允许你平滑物理在固定帧率下运行的效果。

  • isKinematic: 控制物理是否影响刚体。

  • mass: 刚体的质量。

  • maxAngularVelocity: 刚体的最大角速度,以每秒弧度为单位(默认值为 7),范围为 {0, 无穷大}。

  • maxDepenetrationVelocity: 刚体在脱离穿透状态时的最大速度。

  • position: 刚体的位置。

  • rotation: 刚体的旋转。

  • sleepThreshold: 质量归一化的能量阈值,低于此阈值对象将进入睡眠状态。

  • solverIterations: 确定刚体关节和碰撞接触的解析精度。覆盖 Physics.defaultSolverIterations。必须为正数。

  • solverVelocityIterations: 影响刚体关节和碰撞接触的解析精度。覆盖 Physics.defaultSolverVelocityIterations。必须为正数。

  • useGravity: 控制重力是否影响此刚体。

  • velocity: 刚体的速度矢量。它表示刚体位置的变化率。

  • worldCenterOfMass: 刚体在世界空间中的质心(只读)。

Rigidbody类  的公共方法

  • AddExplosionForce: 对刚体施加一个模拟爆炸效果的力。

  • AddForce: 对刚体施加一个力。

  • AddForceAtPosition: 在指定位置施加力。这将同时施加扭矩和力。

  • AddRelativeForce: 相对于刚体的坐标系施加力。

  • AddRelativeTorque: 相对于刚体的坐标系施加扭矩。

  • AddTorque: 对刚体施加扭矩。

  • ClosestPointOnBounds: 附加碰撞体的包围盒上最接近的点。

  • GetPointVelocity: 刚体在世界空间中某点的速度。

  • GetRelativePointVelocity: 相对于刚体在某点的速度。

  • IsSleeping: 刚体是否处于睡眠状态?

  • MovePosition: 将运动学刚体移动到指定位置。

  • MoveRotation: 将刚体旋转到指定旋转。

  • ResetCenterOfMass: 重置刚体的质心。

  • ResetInertiaTensor: 重置惯性张量的值和旋转。

  • SetDensity: 基于附加的碰撞体假设恒定密度来设置质量。

  • Sleep: 强制刚体至少睡眠一帧。

  • SweepTest: 测试刚体在场景中移动时是否会与任何物体发生碰撞。

  • SweepTestAll: 类似于 SweepTest,但返回所有碰撞点。

  • WakeUp: 强制刚体唤醒。

消息

  • OnCollisionEnter: 当此碰撞体/刚体开始接触另一个刚体/碰撞体时调用。

  • OnCollisionExit: 当此碰撞体/刚体停止接触另一个刚体/碰撞体时调用。

  • OnCollisionStay: 对于每个接触的碰撞体/刚体,每帧调用一次。

继承成员

  • gameObject: 附加此组件的游戏对象。组件总是附加到游戏对象上。

  • tag: 此游戏对象的标签。

  • transform: 附加到此游戏对象的变换组件。

  • hideFlags: 对象是否应该隐藏,随场景保存或可由用户修改?

  • name: 对象的名称。

公共方法

  • BroadcastMessage: 在此游戏对象或其任何子对象上的每个 MonoBehaviour 上调用名为 methodName 的方法。

  • CompareTag: 检查游戏对象的标签是否与定义的标签匹配。

  • GetComponent: 获取附加到同一游戏对象上的指定类型的组件引用。

  • GetComponentInChildren: 获取附加到同一游戏对象或其子对象上的指定类型的组件引用。

  • GetComponentInParent: 获取附加到同一游戏对象或其父对象上的指定类型的组件引用。

  • GetComponents: 获取附加到同一游戏对象上的所有指定类型的组件引用。

  • GetComponentsInChildren: 获取附加到同一游戏对象及其子对象上的所有指定类型的组件引用。

  • GetComponentsInParent: 获取附加到同一游戏对象及其父对象上的所有指定类型的组件引用。

  • SendMessage: 在此游戏对象上的每个 MonoBehaviour 上调用名为 methodName 的方法。

  • SendMessageUpwards: 在此游戏对象及其所有祖先上的每个 MonoBehaviour 上调用名为 methodName 的方法。

  • TryGetComponent: 获取指定类型的组件(如果存在)。

  • GetInstanceID: 获取对象的实例 ID。

  • ToString: 返回对象的名称。

静态方法

  • Destroy: 移除游戏对象、组件或资源。

  • DestroyImmediate: 立即销毁对象。强烈建议使用 Destroy 代替。

  • DontDestroyOnLoad: 在加载新场景时不销毁目标对象。

  • FindAnyObjectByType: 检索任何活动加载的指定类型的对象。

  • FindFirstObjectByType: 检索第一个活动加载的指定类型的对象。

  • FindObjectOfType: 返回第一个活动加载的指定类型的对象。

  • FindObjectsByType: 检索所有加载的指定类型的对象列表。

  • FindObjectsOfType: 获取所有加载的指定类型的对象列表。

  • Instantiate: 克隆对象并返回克隆体。

运算符

  • bool: 对象是否存在?

  • operator !=: 比较两个对象是否引用不同的对象。

  • operator ==: 比较两个对象引用是否引用同一个对象。

重点讲一下添加力AddForce()函数:

AddForce: 对刚体施加一个力

AddForce 是 Unity 中 Rigidbody 组件的一个方法,用于对刚体施加一个力。这个力可以是持续的,也可以是瞬间的,取决于你使用的方法和参数。

基本语法

public void AddForce(Vector3 force, ForceMode mode = ForceMode.Force);
  • force: 这是一个 Vector3 类型的参数,表示施加的力的方向和大小。Vector3 有三个分量:xy 和 z,分别表示力在三个轴上的分量。

  • mode: 这是一个可选参数,表示施加力的模式。默认情况下是 ForceMode.Force

ForceMode 参数

ForceMode 是一个枚举类型,有四种模式:

  1. ForceMode.Force: 持续施加力,考虑质量。

  2. ForceMode.Acceleration: 持续施加加速度,忽略质量。

  3. ForceMode.Impulse: 瞬间施加冲量,考虑质量。

  4. ForceMode.VelocityChange: 瞬间改变速度,忽略质量。

示例

假设你有一个小球,你想让它向前移动。你可以使用 AddForce 方法来实现这一点。

using UnityEngine;public class MoveBall : MonoBehaviour
{public Rigidbody rb;void Start(){rb = GetComponent<Rigidbody>();}void FixedUpdate(){// 施加一个向前的力rb.AddForce(Vector3.forward * 10, ForceMode.Force);}
}

在这个例子中:

  • Vector3.forward 表示向前的方向。

  • 10 是力的大小。

  • ForceMode.Force 表示这是一个持续的力,考虑质量。

详细解释
  1. ForceMode.Force:

    • 解释: 当你使用 ForceMode.Force 时,力会持续作用在刚体上,直到你停止施加力。力的效果会根据刚体的质量进行缩放。质量越大,施加相同力的情况下,刚体的加速度越小。

    • 示例: 如果你想模拟一个物体受到持续推力的效果,比如汽车引擎的推力,你可以使用 ForceMode.Force

  2. ForceMode.Acceleration:

    • 解释: 当你使用 ForceMode.Acceleration 时,施加的力不会考虑刚体的质量。这意味着无论刚体的质量是多少,施加的力都会产生相同的加速度。

    • 示例: 如果你想模拟一个物体受到恒定加速度的效果,而不考虑其质量,比如重力加速度,你可以使用 ForceMode.Acceleration

  3. ForceMode.Impulse:

    • 解释: 当你使用 ForceMode.Impulse 时,施加的力会在瞬间作用在刚体上,产生一个瞬间的冲量。冲量的效果会根据刚体的质量进行缩放。质量越大,施加相同冲量的情况下,刚体的速度变化越小。

    • 示例: 如果你想模拟一个物体受到瞬间冲击的效果,比如子弹击中物体,你可以使用 ForceMode.Impulse

  4. ForceMode.VelocityChange:

    • 解释: 当你使用 ForceMode.VelocityChange 时,施加的力会在瞬间改变刚体的速度,而不考虑刚体的质量。这意味着无论刚体的质量是多少,施加的力都会产生相同的速度变化。

    • 示例: 如果你想模拟一个物体瞬间获得速度的效果,比如火箭发射时的瞬间加速,你可以使用 ForceMode.VelocityChange

总结
  • ForceMode.Force: 持续施加力,考虑质量。

  • ForceMode.Acceleration: 持续施加加速度,忽略质量。

  • ForceMode.Impulse: 瞬间施加冲量,考虑质量。

  • ForceMode.VelocityChange: 瞬间改变速度,忽略质量。

选择哪种模式取决于你想要模拟的物理效果。例如,如果你想模拟一个物体受到持续推力的效果,可以使用 ForceMode.Force;如果你想模拟一个物体瞬间获得速度的效果,可以使用 ForceMode.VelocityChange

课堂保龄球游戏代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class BaoLQManager : MonoBehaviour
{// 业务逻辑1:把保龄球扔出去//  业务逻辑2:保龄球 走直线把前面的柱子撞倒//业务逻辑3:如果撞倒一个就+一分//业务逻辑4:如果撞到以后-间隔2秒消失//程序逻辑1:把球和被撞柱子存到代码变量里//程序逻辑2:Rigibody类 给球添加一个力-   // 业务逻辑1:把保龄球扔出去//程序逻辑3:Collider类-碰撞检测,如果有人碰到我,我就让变量+1加分public Rigidbody BaoLqRIGI;//获取保龄球的刚体组件public float ForceStrength = 100f;void Start(){}// Update is called once per framevoid Update(){}void FixedUpdate(){if (Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Space)){BaoLqRIGI.AddForce(new Vector3(0, 0, 1 * ForceStrength * Time.deltaTime), ForceMode.Impulse);//给保龄球添加一个爆发力}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/53509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国产SSL证书品牌怎么选择?

有人在歪曲大型央国企“信创化”与数字化转型建设思路&#xff0c;为了自身的利益开始造谣一些虚假传播信息国外SSL证书不安全问题&#xff0c;然而国外的SSL证书每个上网用户都在使用&#xff0c;然而发布虚假广告的一些人实际上是换了个马甲贴个名字就叫国产SSL证书了&#x…

【农信网-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

无线安全(WiFi)

免责声明:本文仅做分享!!! 目录 WEP简介 WPA简介 安全类型 密钥交换 PMK PTK 4次握手 WPA攻击原理 网卡选购 攻击姿态 1-暴力破解 脚本工具 字典 2-Airgeddon 破解 3-KRACK漏洞 4-Rough AP 攻击 5-wifi钓鱼 6-wifite 其他 WEP简介 WEP是WiredEquivalentPri…

反编译 AndroidManifest.xml文件-android反编译技术

一、安卓打包后目录 想要查看原来版本配置和关联信息&#xff0c;被打包了&#xff0c;这时候需要工具 AXMLPrinter2.jar 二、反编译环境要求 序号软件说明1java电脑得有java环境2AXMLPrinter2.jarapk中xml解析文件 三、反编译指令 java -jar AXMLPrinter2.jar "C:\Us…

【速成Redis】04 Redis 概念扫盲:事务、持久化、主从复制、哨兵模式

前言&#xff1a; 前三篇如下&#xff1a; 【速成Redis】01 Redis简介及windows上如何安装redis-CSDN博客 【速成Redis】02 Redis 五大基本数据类型常用命令-CSDN博客 【速成Redis】03 Redis 五大高级数据结构介绍及其常用命令 | 消息队列、地理空间、HyperLogLog、BitMap、…

【计算机组成原理】实验一:运算器输入锁存器数据写实验

目录 实验要求 实验目的 主要集成电路芯片及其逻辑功能 实验原理 实验内容及步骤 实验内容 思考题 实验要求 利用CP226实验箱上的K16&#xff5e;K23二进制拨动开关作为DBUS数据输入端&#xff0c;其它开关作为控制信号的输入端&#xff0c;将通过K16&#xff5e;K23设定…

C++速通LeetCode中等第3题-盛最多水的容器

双指针法&#xff1a;两个指针分别指向左右边界&#xff0c;记录最大面积&#xff0c;由于面积由短板决定&#xff0c;两个指针中较短的短指针向内移动一格&#xff0c;再次记录最大面积&#xff0c; 直到两指针相遇&#xff0c;得出答案。 class Solution { public:int maxAr…

安卓13设置动态修改设置显示版本号 版本号增加信息显示 android13增加序列号

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 设置 =》关于平板电脑 =》版本号 在这里显示了系统的一些信息,但是这里面的信息并不包含序列号之类的信息,我们修改下系统设置,在这里增加上相关的序列号。 2.问题分析…

打造以太坊数据监控利器:InfluxDB与Grafana构建Geth可视化分析平台

前言 以太坊客户端收集大量数据&#xff0c;这些数据可以按时间顺序数据库的形式读取。为了简化监控&#xff0c;这些数据可以输入到数据可视化软件中。在此页面上&#xff0c;将配置 Geth 客户端以将数据推送到 InfluxDB 数据库&#xff0c;并使用 Grafana 来可视化数据。 一…

多比特AI事业部VP程伟光受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 武汉市多比特信息科技有限公司AI事业部VP程伟光先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“AI对于项目经理工作的影响和变化解析”。大会将于10月26-27日在北京举办&am…

深度学习02-pytorch-04-张量的运算函数

在 PyTorch 中&#xff0c;张量&#xff08;tensor&#xff09;运算是核心操作之一&#xff0c;PyTorch 提供了丰富的函数来进行张量运算&#xff0c;包括数学运算、线性代数、索引操作等。以下是常见的张量运算函数及其用途&#xff1a; 1. 基本数学运算 加法运算&#xff1a…

计算机组成体系与组成结构错题解析【软考】

目录 前言进制转换码制补码 CPU的组成输入/输出技术中断相关概念输入/输出技术的三种方式比较周期相关知识 主存编址计算流水线技术层次化存储体系可靠性 前言 本文专门用来记录本人在做软考中有关计算机上组成体系与组成结构的错题&#xff0c;我始终认为教学相长是最快提高的…

如何利用 opencv 进行 ROI(感兴趣)获取和实现 VR(虚拟现实) 演播室的播放

我是从事医疗软件的开发的。 经常需要从拍摄的医疗视频中获取出病理区域。并计算病理区域的周长和面积。 用 opencv 的术语,这就是感兴趣区域的获取。 (因为都是实时视频,所以速度很关键。代码效率很重要) 有时,需要标注出病理区域,并将非病理区域从视频中去除掉。 如果将…

[教程]如何在iPhone上启用中国移动/联通/电信RCS消息

目前 苹果已经在 iOS 18 中带来 RCS 富媒体消息的支持&#xff0c;该消息基于网络传递&#xff0c;用户可以通过 RCS 免费将消息发送到其他 iPhone 或 Android 设备。在苹果面向测试版用户推出的 iOS 18.1 Beta 版中&#xff0c;中国网络运营商包括中国移动、中国联通、中国电信…

STL-常用算法 遍历/查找/排序/拷贝和替换/算数生成/集合算法

STL常用算法 常用的遍历算法 for_each #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; #include<vector> #include<algorithm>void myPrint(int v) {cout << v << " "; }class MyPrint { public:void op…

产品经理需要了解的AI模型

随着人工智能技术的迅猛发展&#xff0c;AI已经成为各行各业不可或缺的一部分。对于产品经理而言&#xff0c;了解AI模型不仅能促进产品的创新&#xff0c;还能帮助我们更好地理解用户需求&#xff0c;提升产品价值。 下面我将详细介绍四类重要的AI模型——自然语言处理&#…

【云原生安全篇】一文掌握Harbor集成Trivy应用实践

【云原生安全篇】一文掌握Harbor集成Trivy应用实践 目录 1 概念 1.1 什么是 Harbor 和 Trivy&#xff1f; 1.1.1 Harbor 1.1.2 Trivy 1.2 Harbor 与 Trivy 的关系 Trivy 在 Harbor 中的作用&#xff1a; 1.3 镜像扫描工作流程 2 实战案例&#xff1a;在Harbor 配置 Trivy …

2018年国赛高教杯数学建模D题汽车总装线的配置问题解题全过程文档及程序

2018年国赛高教杯数学建模 D题 汽车总装线的配置问题 一&#xff0e;问题背景   某汽车公司生产多种型号的汽车&#xff0c;每种型号由品牌、配置、动力、驱动、颜色5种属性确定。品牌分为A1和A2两种&#xff0c;配置分为B1、B2、B3、B4、B5和B6六种&#xff0c;动力分为汽油…

Golang | Leetcode Golang题解之第416题分割等和子集

题目&#xff1a; 题解&#xff1a; func canPartition(nums []int) bool {n : len(nums)if n < 2 {return false}sum, max : 0, 0for _, v : range nums {sum vif v > max {max v}}if sum%2 ! 0 {return false}target : sum / 2if max > target {return false}dp …

fastadmin 根据选择数据来传参给selectpage输入框

文章目录 js代码php代码&#xff1a;完结 js代码 $(document).on(change,#table .bs-checkbox [type"checkbox"],function(){let url$(#chuancan).attr(data-url)urlurl.split(?)[0]let idsTable.api.selectedids(table)if(ids.length){let u_id[]ids.forEach(eleme…