做任务挣钱网站,wordpress邀请码注册功能,短视频制作培训班,沈阳突发事件刚刚Rigidbody 刚体组件
Rigidbody 是 Unity 中的一个组件#xff0c;它可以让你的游戏对象像真实世界中的物体一样移动和碰撞。想象一下#xff0c;你有一个小球#xff0c;你希望它像真实世界中的球一样滚动、弹跳和碰撞#xff0c;那么你就可以给这个小球添加一个 Rigidbod…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 GetComponentRigidbody();}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把球和被撞柱子存到代码变量里//程序逻辑2Rigibody类 给球添加一个力- // 业务逻辑1把保龄球扔出去//程序逻辑3Collider类-碰撞检测如果有人碰到我我就让变量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);//给保龄球添加一个爆发力}}
}