目录
一. 角色控制
名称: | 功能: |
---|---|
坡度限制 | 将碰撞器限制为仅爬升比指示值更陡峭(以度为单位)的斜坡。 |
步长偏移 | 只有当楼梯离地面比指示值更近时,角色才会爬上楼梯。此值不应大于 Character Controller 的高度,否则将生成错误。 |
蒙皮宽度 | 两个碰撞体可以相互穿透,深度可达其 Skin Width (蒙皮宽度)。较大的 Skin Width 可减少抖动。低 Skin Width 会导致角色卡住。一个好的设置是将该值设为 Radius 的 10%。 |
最小移动距离 | 如果角色尝试移动到指示值以下,则它根本不会移动。这可用于减少抖动。在大多数情况下,此值应保留为 0。 |
中心 | 这将在世界空间中偏移胶囊碰撞体,并且不会影响角色的旋转方式。 |
半径 | 胶囊碰撞体半径的长度。这实际上是碰撞体的宽度。 |
高度 | 角色的胶囊碰撞器 高度。更改此设置将沿 Y 轴在正方向和负方向上缩放碰撞体。 |
Character Controller(角色控制器)
-
功能特点:
- 主要用于模拟角色的基本运动,如行走、跑步、跳跃等,而不依赖于物理引擎的刚体。
- 可以方便地控制角色与场景中的物体进行碰撞检测,避免角色穿透墙壁等物体。
- 提供了一些内置的属性和方法,用于设置角色的速度、重力、碰撞响应等。
-
主要属性:
- Slope Limit:限制角色可以攀爬的最大坡度。
- Step Offset:角色可以跨越的台阶高度。
- Skin Width:用于碰撞检测的皮肤宽度,以避免角色在与物体接近时出现抖动。
- Min Move Distance:如果角色的移动距离小于这个值,则不会进行移动,以避免微小的移动导致不必要的计算。
-
使用方法:
- 通过脚本获取 Character Controller 组件,并在 Update 函数中使用 Move 方法来实现角色的移动。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
public float speed;
private CharacterController controller;
// Start is called before the first frame update
void Start()
{
controller = GetComponent<CharacterController>();
}
// Update is called once per frame
void Update()
{
Vector3 moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
moveDirection = transform.TransformDirection(moveDirection);
controller.Move(moveDirection * speed * Time.deltaTime);
}
}
二. 3D刚体
名称 | 功能 |
---|---|
质量 | 定义游戏对象的质量(以千克为单位)。默认情况下,Mass 设置为 1。与现实生活中一样,质量不会影响物品在重力作用下的速度。要模拟减慢运动速度的阻力,请使用 Drag (拖动)。 |
拉 | 定义刚体线速度的衰减率,以模拟阻力、空气阻力或摩擦力。较低的值会产生较慢的衰减速率,因此游戏对象的移动速度会更长(这对于模拟繁重的现实世界对象非常有用)。较高的值会产生更快的衰减速率,因此游戏对象会在短时间内减慢速度(这对于模拟轻量级真实世界对象非常有用)。 |
角度阻力 | 定义刚体旋转速度的衰减率,以模拟阻力、空气阻力或摩擦力。较低的值会产生较慢的衰减速率,因此游戏对象的移动速度会更长(这对于模拟繁重的现实世界对象非常有用)。较高的值会产生更快的衰减速率,因此游戏对象会在短时间内减慢速度(这对于模拟轻量级真实世界对象非常有用)。请注意,不能仅通过将游戏对象的 Angular Drag 设置为无穷大来使游戏对象停止旋转。默认情况下,Angular Drag 设置为 0.05。 |
自动质心 | 启用 Automatic Center Of Mass (自动质心) 以使用物理系统根据刚体的形状和比例预测的刚体质心。禁用可设置您自己的质心 X、Y 和 Z 坐标。 |
自动张量 | 启用 Automatic Tensor (自动张量) 以使用物理系统对刚体的预测张量和张量旋转,基于所有连接的碰撞器 .与质量一样,惯性张量定义使刚体移动所需的力或扭矩;但是,质量影响线性运动,而惯性张量影响旋转运动。禁用 可改为张量设置您自己的 X、Y 和 Z 坐标(请参阅下面的属性)。 |
- 惯性张量 | 定义此刚体的惯性张量。Inertia Tensor 值越高,使刚体绕其轴旋转所需的扭矩就越大。 |
- 惯性张量旋转 | 定义惯性张量的旋转。 |
使用重力 | 切换 Rigidbody 上的重力效果。如果启用,物理系统将施加一个力,使游戏对象沿模拟重力的方向移动(默认情况下,沿 y 轴向下移动)。默认情况下,Use Gravity 处于启用状态。 |
是运动学的 | 在游戏对象的基于物理的运动和运动之间切换。启用 Is Kinematic 后,物理系统无法施加力来移动或旋转游戏对象,而 Unity 只能通过其 Transform 移动和旋转游戏对象。有关详细信息,请参阅刚体物理特性简介:没有基于物理的运动的刚体。默认情况下,Is Kinematic 处于禁用状态。 |
插话 | 刚体上的 Interpolate (插值) 设置提供了两个选项,如果刚体运动在运行时出现抖动,则用于平滑刚体运动的外观。这些选项包括 Interpolate (插值) 和 Extrapolate (外插)。 interpolation (插值) 和 Extrapolation (外插) 都会计算物理更新之间刚体的姿势 (即位置和旋转)。您应该选择哪一个选项取决于哪个选项为您的使用案例产生最佳视觉效果。 有关 Interpolate 属性的详细信息,请参阅将插值应用于刚体。 |
- 没有 | 不应用插值或外插。这是默认选项。 |
- 插话 | 使用前两次物理更新中刚体的姿势和速度来计算和应用刚体在当前帧中的姿势。 Interpolate 比 Extrapolate 更准确,但它有一个物理更新的时间滞后。这通常最适合准确性很重要的情况;例如,如果刚体的速度发生变化,或者有其他物理元素影响刚体的运动。 |
- 外推 | 使用上一次物理更新中刚体的姿态和速度,并预测下一次物理更新中刚体的姿态,以计算和预测当前帧中的姿态。 Extrapolate 使刚体看起来略微领先于其应有的位置,并且可能略微不准确。这通常最适合精度不重要的情况;例如,如果刚体以恒定速度移动,并且没有其他物理元素影响刚体的移动。 |
碰撞检测 | 定义物理系统如何检测此刚体的碰撞体与场景中的其他碰撞体之间的碰撞。Unity 为每对碰撞体生成一个碰撞,并根据此 Collision Detection 属性确定碰撞检测方法。 默认情况下,Collision Detection (重叠检测) 设置为 Discrete (离散)。有关每种冲突检测类型的更多信息,请参阅连续碰撞检测 . |
- 离散 | 物理系统使用 discrete碰撞 detection 来计算此刚体碰撞器的碰撞。如果此刚体不涉及任何快速移动的碰撞,请选择 Discreation。离散 碰撞检测 不是很计算密集。 |
- 连续的 | 物理系统使用基于扫描的 CCD 来计算此刚体的碰撞体与任何静态碰撞体(即没有关联刚体的碰撞体)之间的碰撞。如果此刚体涉及与静态碰撞体的快速移动碰撞,请选择 Continuous。基于扫描的 CCD 比 Discrete 或 Continuous Speculative 的计算密集度更高。 |
- 连续动态 | 物理系统使用基于扫描的 CCD 来计算此刚体的碰撞体与所有其他碰撞体之间的碰撞,但设置为 Discrete collision detection (离散碰撞检测的碰撞体除外)。如果此刚体涉及与任何碰撞体的快速移动碰撞,请选择 Continuous Dynamic。基于扫描的 CCD 比 Discrete 或 Continuous Speculative 的计算密集度更高。 |
- 持续投机 | 物理系统使用推测性连续碰撞检测 来计算此刚体的碰撞体与所有其他碰撞体之间的碰撞。如果碰撞精度对于此刚体不重要,请选择 Continuous Specative。推测性碰撞检测的计算量比 Discrete 高,但比 Continuous 或 Continuous Dynamic 的计算量低。 |
约束 | 对刚体的移动施加限制。 |
- 冻结位置 | 选择性地停止刚体在世界 X、Y 和 Z 轴上移动。 |
- 冻结旋转 | 有选择地停止刚体围绕局部 X、Y 和 Z 轴旋转。 |
在 Unity 中,刚体(Rigidbody)是用于模拟物理效果的重要组件。
A、刚体的基本概念
- 定义:刚体是一种物理对象,它在物理模拟中具有一定的质量、形状和运动属性,并且遵循牛顿力学定律。在 Unity 中,刚体组件可以添加到游戏对象上,使其能够受到重力、碰撞和其他物理力的影响。
- 作用:刚体组件使得游戏对象能够在物理世界中进行真实的运动和交互。它可以模拟物体的运动、碰撞、反弹等物理现象,为游戏增加真实感和趣味性。
B、刚体的主要属性
- Mass(质量):
- 定义了刚体的质量大小。质量越大,物体受到的重力和惯性就越大。
- 质量的单位是千克(kg)。可以根据实际需求调整物体的质量,以实现不同的物理效果。
- Drag(阻力):
- 决定了刚体在运动过程中受到的空气阻力大小。阻力越大,物体运动的速度就会越快地减慢。
- 阻力的单位是牛顿秒每米(N・s/m)。可以根据物体的运动速度和环境来调整阻力值,以模拟不同的运动情况。
- Angular Drag(角阻力):
- 控制刚体旋转时受到的阻力大小。角阻力越大,物体旋转的速度就会越快地减慢。
- 角阻力的单位也是牛顿秒每米(N・s/m)。可以根据物体的旋转速度和需求来调整角阻力值。
- Use Gravity(使用重力):
- 一个布尔值选项,决定刚体是否受到重力的影响。如果勾选该选项,刚体将受到 Unity 中预设的重力作用。
- 默认情况下,Use Gravity 选项是勾选的,这意味着大多数物体都会受到重力影响而向下掉落。
- Is Kinematic(是否为运动学刚体):
- 一个布尔值选项,用于将刚体设置为运动学刚体或普通刚体。
- 如果勾选 Is Kinematic 选项,刚体将不受物理引擎的影响,而是通过脚本或动画来控制其运动。运动学刚体通常用于与其他刚体进行碰撞检测,但不参与物理模拟。
- 如果不勾选 Is Kinematic 选项,刚体将受到物理引擎的控制,遵循牛顿力学定律进行运动。
C、刚体的常见方法
- AddForce(施加力):
- 用于向刚体施加一个力,使其产生加速度并开始运动。
- 可以通过指定力的大小和方向来控制刚体的运动。例如,可以使用 AddForce (Vector3.forward * 10) 向刚体施加一个向前的力,使其向前加速运动。
- AddTorque(施加扭矩):
- 向刚体施加一个扭矩,使其产生旋转加速度并开始旋转。
- 可以通过指定扭矩的大小和方向来控制刚体的旋转。例如,可以使用 AddTorque (Vector3.up * 10) 向刚体施加一个向上的扭矩,使其绕 y 轴旋转。
- Sleep(使刚体休眠):
- 当刚体处于静止状态时,可以使用 Sleep 方法将其设置为休眠状态,以减少物理计算的开销。
- 休眠的刚体将不会参与物理模拟,直到受到外力作用或被唤醒。可以使用 WakeUp 方法唤醒休眠的刚体。
- IsSleeping(判断刚体是否处于休眠状态):
- 返回一个布尔值,表示刚体是否处于休眠状态。
- 可以在脚本中使用这个方法来检查刚体的状态,并根据需要进行相应的处理。
D、刚体的碰撞检测
- Collider(碰撞器):
- 刚体通常需要与碰撞器组件一起使用,才能实现碰撞检测。碰撞器定义了物体的形状和大小,用于检测物体之间的碰撞。
- Unity 提供了多种类型的碰撞器,如 Box Collider(盒子碰撞器)、Sphere Collider(球体碰撞器)、Capsule Collider(胶囊碰撞器)等。可以根据物体的形状选择合适的碰撞器类型。
- OnCollisionEnter(碰撞开始事件):
- 当刚体与其他物体发生碰撞时,会触发 OnCollisionEnter 事件。可以在脚本中重写这个方法来处理碰撞事件。
- 例如,可以在 OnCollisionEnter 方法中播放碰撞音效、减少物体的生命值等。
- OnTriggerEnter(触发开始事件):
- 当刚体进入一个触发器区域时,会触发 OnTriggerEnter 事件。触发器是一种特殊的碰撞器,它不会产生物理碰撞效果,而是用于检测物体的进入和离开。
- 可以在脚本中重写 OnTriggerEnter 方法来处理触发事件。例如,可以在触发器区域中触发剧情、打开门等。
E、刚体的应用场景
- 游戏角色控制:
- 可以使用刚体来模拟游戏角色的运动和碰撞。通过施加力和扭矩,可以控制角色的移动、跳跃和攻击等动作。
- 结合动画和物理效果,可以使角色的动作更加真实和自然。
- 物体交互:
- 刚体可以用于模拟物体之间的交互,如推箱子、碰撞球等游戏。通过检测碰撞和施加力,可以实现物体的移动、碰撞和反弹等效果。
- 物理模拟:
- 在一些模拟类游戏中,刚体可以用于模拟真实的物理现象,如重力、摩擦力、弹性等。通过调整刚体的属性和碰撞器,可以实现不同的物理效果。
三.扩展
Constant Force 将恒定力添加到刚体这适用于游戏对象随时间加速的运动。
名称: | 功能: |
---|---|
力 | 定义线性力的方向。XYZ 向量引用现场 的全局轴。 |
相对力 | 定义线性力的方向。XYZ 矢量是指刚体的局部轴。 |
力矩 | 定义刚体旋转的全局轴。 |
相对扭矩 | 定义刚体旋转的局部轴。 |