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
有三个分量:x
、y
和z
,分别表示力在三个轴上的分量。 -
mode: 这是一个可选参数,表示施加力的模式。默认情况下是
ForceMode.Force
。
ForceMode 参数
ForceMode
是一个枚举类型,有四种模式:
-
ForceMode.Force: 持续施加力,考虑质量。
-
ForceMode.Acceleration: 持续施加加速度,忽略质量。
-
ForceMode.Impulse: 瞬间施加冲量,考虑质量。
-
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
表示这是一个持续的力,考虑质量。
详细解释
-
ForceMode.Force:
-
解释: 当你使用
ForceMode.Force
时,力会持续作用在刚体上,直到你停止施加力。力的效果会根据刚体的质量进行缩放。质量越大,施加相同力的情况下,刚体的加速度越小。 -
示例: 如果你想模拟一个物体受到持续推力的效果,比如汽车引擎的推力,你可以使用
ForceMode.Force
。
-
-
ForceMode.Acceleration:
-
解释: 当你使用
ForceMode.Acceleration
时,施加的力不会考虑刚体的质量。这意味着无论刚体的质量是多少,施加的力都会产生相同的加速度。 -
示例: 如果你想模拟一个物体受到恒定加速度的效果,而不考虑其质量,比如重力加速度,你可以使用
ForceMode.Acceleration
。
-
-
ForceMode.Impulse:
-
解释: 当你使用
ForceMode.Impulse
时,施加的力会在瞬间作用在刚体上,产生一个瞬间的冲量。冲量的效果会根据刚体的质量进行缩放。质量越大,施加相同冲量的情况下,刚体的速度变化越小。 -
示例: 如果你想模拟一个物体受到瞬间冲击的效果,比如子弹击中物体,你可以使用
ForceMode.Impulse
。
-
-
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);//给保龄球添加一个爆发力}}
}
相关文章:

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

MySQL学习笔记(持续更新中)
1、Mysql概述 1.1 数据库相关概念 三个概念:数据库、数据库管理系统、SQL 名称全称简称数据库存储数据的仓库,数据是有组织的进行存储DataBase(DB)数据库管理系统操纵和管理数据库的大型软件DataBase Mangement System…...

sqlserver插入数据删除数据
1、插入数据 1.1 直接插入 1.1.1 方式一 insert into test values(001,黎明,1),(002,冯绍峰,1),(003,菲菲,2);1.1.2 方式二 insert into test(ID,Name,Sex) values(004,丽丽,2),(005,凌晨,2),(006,虾米,1);1.2 插入部分行 insert into test(ID,Name) values(007,红)2、删除…...

[51单片机] 简单介绍 (一)
文章目录 1.单片机介绍2.单片机内部三大资源3.单片机最小系统4.STC89C52单片机 1.单片机介绍 兼容Intel的MCS-51体系架构的一系列单片机。 STC89C52:8K FLASH、512字节RAM、32个IO口、3个定时器、1个UART、8个中断源。 单片机简称MCU单片机内部集成了CPU、RAM、RO…...

6个岗位抢1个人,百万年薪抢毕业生?大厂打响AI人才战
前言 “24岁毕业时年薪50万元,到了30岁大概能升到P7(注:职级名称),那时就能年薪百万了。” 从上海交大硕士毕业后,出生于2000年的赵宏在今年入职腾讯,担任AI算法工程师,成为AI风口下第一批就业…...

erlang学习:Linux命令学习3
shell基本输出 创建一个test.sh文件,并开放他的权限,之后向其中编辑以下内容 touch test.sh chmod 777 test.sh vim test.shecho "hello linux"之后运行相应shell程序得到输出 ./test.sh变量 单引号特点: 单引号里的任何字符都…...

力扣41 缺失的第一个正数 Java版本
文章目录 题目描述代码 题目描述 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除…...

第五篇:Linux进程的相关知识总结(1)
目录 第四章:进程 4.1进程管理 4.1.1进程管理需要的学习目标 4.1.1.1了解进程的相关信息 4.1.1.2僵尸进程的概念和处理方法: 4.1.1.3PID、PPID的概念以及特性: 4.1.1.4进程状态 4.1.2进程管理PS 4.1.2.1静态查看进程 4.1.2.1.1自定义…...

企业级Windows server服务器技术(1)
windows server服务器安装 准备工作: 1.准备安装的镜像 2.安装好虚拟机VMware或者virtual box 3.准备安装的位置(选择你的电脑的磁盘上比较空闲的位置,新建一个文件夹并命名) 4.开始安装(按步骤)----…...

【30天玩转python】单元测试与调试
单元测试与调试 在 Python 开发中,编写单元测试和进行调试是保证代码质量、减少错误的重要步骤。单元测试可以帮助我们验证代码功能是否符合预期,调试则可以在代码出现问题时快速定位错误原因。 1. 单元测试简介 单元测试是对程序中最小可测试部分&…...

13.第二阶段x86游戏实战2-动态模块地址
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要…...

【WebLogic】WebLogic 11g 控制台模式下安装记录
WebLogic 11g的安装有三种方式: 1)GUI图形化模式; 2)控制台模式; 3)静默模式; 下面为大家展示下控制台模式下的安装过程记录,整个安装过程大部分都是回车,仅在【接收…...

失踪人口回归(明天开始继续更新学习内容)
从明天开始继续更新个人学习经验及收获,可能会直接从C入门开始,总结一下C在C的基础上增加的新语法。这篇就当作水贴算了,大家别点赞,留点赞给明天的文章,哈哈 我是安姐的修沟..............

AIGC对网络安全的影响
AIGC对网络安全的影响 引言 人工智能生成内容(AIGC)技术的快速发展对网络安全领域产生了深远影响。AIGC不仅在内容创作、媒体生成等方面展现了强大的能力,还可能被恶意使用,带来新的安全威胁。本文将探讨AIGC对网络安全的影响,列举实际案例,并提供相关建议。 AIGC技术…...

golang学习笔记25——golang 实现 MD5加密、RSA加密 和 Base64编码
推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...

2024海外电商数据分析之印度篇
在2024年,印度电商市场继续保持着强劲的增长势头,成为全球电商领域中的一个亮点。根据Inc42发布的《2024年上半年印度电商市场报告》,印度电商市场规模已经达到1160亿美元,预计在2023年至2030年间,将以19%的复合年增长…...

JavaWeb纯小白笔记02:Tomcat的使用:发布项目的三种方式、配置虚拟主机、配置用户名和密码
通过Tomcat进行发布项目的目的是为了提供项目的访问能力:Tomcat作为Web服务器,能够处理HTTP请求和响应,将项目的内容提供给用户进行访问和使用。 一.Tomcat发布项目的三种方式: 第一种:直接在Tomcat文件夹里的webapp…...

为什么数据需要 QA 流程
当有人问我做什么工作时,我会说我是一名数据质量保证 (QA) 工程师。他们并不真正理解我的意思。“嗯,我做数据测试,”我试图解释,但常常无济于事。我有一些从事技术和软件开发的朋友,他们不太了解数据测试是什么&#…...

Spring Boot 学习之路 -- 基础认知
前言 最近因为业务需要,被拉去研究后端的项目,代码框架基于 Spring Boot,对我来说完全小白,需要重新学习研究…出于个人习惯,会以 Blog 文章的方式做一些记录,文章内容基本来源于「 Spring Boot 从入门到精…...

JavaScript --json格式字符串和对象的转化
json字符串解析成对象 : var obj JSON.parse(str) 对象转化成字符串:var str1 JSON.stringify(obj1) <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Com…...

LabVIEW提高开发效率技巧----采用并行任务提高性能
在复杂的LabVIEW开发项目中,合理利用并行任务可以显著提高系统的整体性能和响应速度。并行编程是一种强大的技术手段,尤其适用于实时控制、数据采集以及多任务处理等场景。LabVIEW的数据流编程模型天然支持并行任务的执行,结合多核处理器的硬…...

裸土检测算法实际应用、裸土覆盖检测算法、裸土检测算法
裸土检测算法主要用于环境保护、农业管理、城市规划和土地管理等领域,通过图像识别技术来检测和识别地表上的裸露土壤。这种技术可以帮助管理者实时监控裸土面积,及时采取措施,防止水土流失、环境污染和生态退化。 一、技术实现 裸土检测算…...

深入剖析链表反转:多语言实现与高级语法特性20240924
深入剖析链表反转:多语言实现与高级语法特性 引言 在数据结构与算法的学习中,链表是基础结构之一,尤其在动态内存分配和操作中体现了它的重要性。今天,我们将通过反转单链表这一经典算法题,从不同编程语言的角度进行…...

【数据结构初阶】链式二叉树接口实现超详解
文章目录 1. 节点定义2. 前中后序遍历2. 1 遍历规则2. 2 遍历实现2. 3 结点个数2. 3. 1 二叉树节点个数2. 3. 2 二叉树叶子节点个数2. 3. 3 二叉树第k层节点个数 2. 4 二叉树查找值为x的节点2. 5 二叉树层序遍历2. 6 判断二叉树是否是完全二叉树 3. 二叉树性质 1. 节点定义 用…...

力扣189 轮转数组 Java版本
文章目录 题目描述代码 题目描述 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4…...

RMAN异机恢复数据库记录
场景:数据库服务器宕机,无法恢复 处理:使用备份资料进行异地恢复 1.此处环境为同平台、同版本(操作系统版本可以不同,但数据库版本需相同),源机器和目标机器具有相同的目录结构。 2.目标机器只…...

JVM 调优篇7 调优案例4- 线程溢出
一 线程溢出 1.1 报错信息 每个 Java 线程都需要占用一定的内存空间,当 JVM 向底层操作系统请求创建一个新的 native 线程时,如果没有足够的资源分配就会报此类错误。报错信息:java.lang.outofmemoryError:unable to create new Native Thr…...

C++类与对象(三)
目录 1.再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit关键字 2.STATIC成员 2.1 概念 2.2 特性 3.C中成员初始化的新玩法 4.友元 4.1 友元函数 4.2 友元类 5.内部类 6.再次理解封装 7.再次理解面向对象 本次内容大纲: 1.再谈构造函数 …...

云栖实录 | 阿里云 OpenLake 解决方案重磅发布:多模态数据统一纳管、引擎平权联合计算、数据共享统一读写
新一轮人工智能浪潮正在重塑世界,以生成式 AI 为代表的技术快速应用,推动了数据与智能的深化融合,同时也给数据基础设施带来了全新的变革与挑战。面向 AI 时代的数据基础设施如何构建?底层数据平台架构在 AI 时代如何演进…...

《线性代数》学渣笔记
文章目录 1 行列式1.1 克拉默法则1.2 基本性质1.3 余子式 M i j M_{ij} Mij1.4 代数余子式 A i j ( − 1 ) i j ⋅ M i j A_{ij} (-1)^{ij} \cdot M_{ij} Aij(−1)ij⋅Mij1.5 具体型行列式计算(化为基本型)1.5.1 主对角线行列式:主…...