前言
Unity的Physics类是Unity物理系统的核心,提供了一套用于处理和控制物理模拟的API。这个类提供了用于控制物理系统的全局属性和方法,以及检测和施加力到游戏对象,处理碰撞和触发器事件等。为了让开发者都能更好理解这个Physics类,它的属性都狠详细解释,导致篇章过长,故拆分来讲解。
为了使Unity的Physics类的属性和方法更为清晰,我们可以将它们根据用途和功能进行分类:
1. 基础物理属性:
①全局物理特性:(这些属性设置了物理模拟的一般行为)
Physics.gravity: 定义在游戏世界中的重力值。
Physics.defaultContactOffset: 两个碰撞物体之间的接触点偏移。
Physics.defaultSolverIterations: 物理求解器用于求解接触和关节的迭代次数。
Physics.defaultSolverVelocityIterations: 物理求解器用于改进关节和联系点精度的默认求解器速度迭代次数。
Physics.defaultMaxAngularSpeed:物体的最大角速度。
Physics.defaultMaxDepenetrationVelocity:物体出现穿透时的最大速度。
Physics.autoSimulation:是否自动模拟物理。
Physics.autoSyncTransforms:是否在每次模拟后自动同步物体的变换(Transforms)。
Physics.defaultPhysicsScene:Unity中的默认物理场景。
②碰撞检测设置:(这些属性主要负责碰撞检测的参数设置)
Physics.bounceThreshold: 两个物体相互碰撞时的最小速度(速度阈值),低于这个阈值的碰撞会被当作是非弹性碰撞。
Physics.sleepThreshold: 对象进入休眠状态前的最小阈值,速度低于此值的物体会进入休眠状态。
Physics.queriesHitBackfaces:是否检测背面,这个布尔属性定义了射线投射是否会命中背面。
Physics.queriesHitTriggers:是否检测触发器,这个布尔属性定义了物理查询(射线投射、球体投射等)是否会检测触发器。
Physics.reuseCollisionCallbacks:是否应在同一帧中多次触发同一对碰撞物体的碰撞回调(是否重用碰撞回调)。
③布料与互碰撞:(这些属性与布料的物理行为和物体间的互碰撞有关)
Physics.clothGravity:布料的重力。
Physics.interCollisionDistance:设置布料间碰撞的最小分离距离。
Physics.interCollisionStiffness:设置布料间互碰撞的刚度。
Physics.interCollisionSettingsToggle:是否开启布料互碰撞设置。
Physics.gravity
Physics.gravity是一个 Vector3 类型,它用于表示全局重力的方向和大小。这个值对 Unity 中所有的 Rigidbody 物体都生效,除非 Rigidbody 物体的 useGravity 属性被设置为 false默认值是 (0, -9.81, 0),模拟了真实世界的重力(向下,加速度为 9.81 m/s²)。
你可以修改这个值来改变游戏世界的重力。
例如,你可以通过以下代码增加重力:
Physics.gravity = new Vector3(0, -20.0f, 0);
或者你可以创建一个向右的重力:
Physics.gravity = new Vector3(9.81f, 0, 0);
这些代码可以在任何地方调用,但常见的做法是在游戏启动时(如在 MonoBehaviour 的 Start 方法内)进行设置。
注意:修改 Physics.gravity 将影响所有 Rigidbody 物体,这可能会对游戏的物理行为产生大影响,所以在修改之前要充分考虑。
Physics.defaultContactOffset
Physics.defaultContactOffset 是一个表示默认接触偏移的浮点数。接触偏移是在接触点周围形成接触的碰撞器间的空隙,用于确保稳定的物理模拟。这个空隙允许Unity预测两个物体之间的碰撞。
当物体接近到相对于它们的半径或者大小的一小部分的距离时,Unity就会开始计算它们之间的碰撞。defaultContactOffset定义了这个“一小部分”的大小。比如,一个半径为1的球体和一个半径为2的球体,如果defaultContactOffset设置为0.1,那么当这两个球体相距小于或等于0.3时,Unity就会开始计算它们之间的碰撞。
默认情况下,这个值是0.01,适用于大多数游戏。你可以根据需要修改这个值,但要注意的是,如果这个值设置得太大,可能会导致物体在看起来没有接触的地方就产生了碰撞;如果这个值设置得太小,可能会导致物理模拟不稳定,特别是在物体高速移动或者旋转的情况下。
以下是如何设置这个值的例子:
// 设置默认接触偏移为0.02
Physics.defaultContactOffset = 0.02f;
Physics.defaultSolverIterations
Physics.defaultSolverIterations 控制了物理引擎在解决约束(如关节或碰撞)时要进行多少迭代。
当物体在Unity的物理环境中互相作用时,为了正确地模拟这些交互,物理引擎必须"解决"一系列的数学约束。这包括事物如何碰撞、如何反弹、如何在碰撞中互相影响等等。由于这些约束可能会相互影响,因此物理引擎必须多次迭代地解决它们,以确保结果的准确性。
迭代次数的设定是一个权衡:
较高的迭代次数:可以提供更精确和稳定的物理模拟,但可能增加计算的复杂性和CPU的负载。
较低的迭代次数:可能会更快,但可能导致不准确或不稳定的模拟,特别是在复杂的物理交互中。
默认情况下,defaultSolverIterations 的值为6。这是Unity团队找到的一个折中的数值,旨在为大多数游戏提供合理的精确性和性能。
如果你在游戏中遇到物理模拟的不稳定性(例如,关节在受到压力时分离,或物体在高速运动时穿过其他物体),你可以考虑增加这个值。但要记住,增加迭代次数会增加CPU的负载,所以在进行此类更改时应该进行性能测试。
// 设置默认求解器迭代次数为8
Physics.defaultSolverIterations = 8;
Physics.defaultSolverVelocityIterations
Physics.defaultSolverVelocityIterations是控制 Unity 物理引擎进行速度约束求解时的迭代次数的属性。这个值表示当解决速度约束(例如物体间的冲突如何影响它们的速度)时,求解器应执行的默认迭代次数。
物理模拟中的速度约束是描述物体如何因碰撞而改变其速度的数学方程。求解器的工作就是找到满足这些约束的速度值,这通常需要多次迭代,因为每次迭代都会为约束找到一个稍微更好的解决方案。
同样地,迭代次数的设置也是一个权衡:
较高的迭代次数:将提供更精确的速度模拟结果,但会增加计算的复杂性和CPU负载。
较低的迭代次数:可能会更快,但可能导致速度模拟不够准确。
默认情况下,defaultSolverVelocityIterations 的值为 1,这是为大多数应用场景提供合理的速度模拟准确性和性能的设置。
如果你发现游戏中的物体在碰撞后速度表现不稳定或不准确,可以考虑增加这个值。但与前面所述的类似,增加迭代次数会增加计算负担,因此在进行更改时应进行性能测试。
Physics.defaultSolverVelocityIterations = 3;
注意:更改这个值时最好在实际的游戏环境中测试,以确认更改是否提高了速度模拟的准确性,并确保没有导致性能问题。
Physics.defaultMaxAngularSpeed
Physics.defaultMaxAngularSpeed定义了一个物体在物理模拟中可能达到的最大角速度(以弧度/秒为单位)。当你改变这个值时,它会影响所有新创建的刚体(Rigidbody),但不会影响已经存在的刚体。
Angular speed(角速度)描述了物体绕其旋转轴旋转的速度。如果一个物体的角速度过高,可能会导致物理模拟出现不真实或者不稳定的结果。通过设定一个全局的最大角速度上限,你可以在一定程度上确保物理模拟的稳定性。
应用场景:
改善物理模拟的稳定性:
如果你的游戏中有物体在碰撞后旋转得非常快,可能会导致模拟出现问题,例如物体穿过其他物体而不是与其正确碰撞。通过限制角速度,你可以避免这类问题。
特定的游戏逻辑:
在某些游戏中,你可能想要限制物体的旋转速度。例如,在一个飞行模拟游戏中,你可能不希望飞机在空中进行太快的旋转。
例子:
假设你创建了一个可以被击打的球,而当它被击打时,它的角速度增加。但你不希望它旋转得太快,以致于看起来不真实。
void Start()
{
Physics.defaultMaxAngularSpeed = 10.0f;
Rigidbody rb = gameObject.AddComponent<Rigidbody>();
}
void OnCollisionEnter(Collision collision)
{
// 当球被击打时增加角速度
if (collision.gameObject.CompareTag("Bat"))
{
Rigidbody rb = GetComponent<Rigidbody>();
rb.angularVelocity = new Vector3(0, 15, 0); // 试图设置一个很大的角速度
}
}
上述代码中,即使我们试图为球设定一个非常高的角速度,由于 Physics.defaultMaxAngularSpeed 的限制,它的角速度将不会超过 10.0 弧度/秒。
Physics.defaultMaxDepenetrationVelocity
Physics.defaultMaxDepenetrationVelocity控制了当两个物体重叠时,物理引擎试图分开它们的最大速度。在物理模拟中,理想情况下,两个物体不应该相互穿透或重叠,但在实际情况中,因为计算的离散性或者其他原因,物体可能会重叠。当这种情况发生时,物理引擎会试图通过施加一个"解穿透"速度来修正这种重叠,使得两个物体重新分开。
这个属性定义了解决这种物体重叠问题的速度上限。较高的值会使物体更快地分开,但也可能导致模拟不稳定。较低的值可能会使得物体较慢地分开,但可能会看起来更为自然。
应用场景:
增强物理稳定性: 如果你的游戏中有大量物体经常发生重叠,或者有大型的物体经常重叠,可以适当增加这个值,使得这些物体能够更快地分开。
特定的游戏逻辑: 在某些情况下,你可能想要让物体在重叠后更慢地分开,以实现某种特定的效果或游戏逻辑。
例子:
假设你在开发一个塔防游戏,游戏中的敌人在某些情况下可能会重叠。你希望在敌人重叠时它们能够较快地分开,以避免看起来不真实的情况。
void Start()
{
Physics.defaultMaxDepenetrationVelocity = 5.0f;
}
通过上述代码,我们提高了解穿透速度的上限,这将使得重叠的敌人能够更快地分开。
Physics.autoSimulation
Physics.autoSimulation控制了Unity是否在每一帧自动执行物理模拟。当此属性设置为true(默认情况下),物理模拟会在每一帧自动进行,这意味着所有的刚体、碰撞器和其他物理相关的组件都会根据物理规则进行模拟。
如果将此属性设置为false,则物理模拟不会自动执行。这意味着开发者需要显式调用 Physics.Simulate 方法来手动进行物理模拟。
应用场景:
控制物理模拟的时间: 有时,你可能需要在特定的时刻或者特定的条件下进行物理模拟,而不是在每一帧。此时,可以关闭自动模拟,并手动调用 Physics.Simulate。
暂停与继续: 例如,如果你希望在游戏暂停菜单中停止所有的物理活动,你可以将 autoSimulation 设置为 false。当玩家从暂停菜单返回到游戏时,再次将其设置为 true。
高级物理效果: 在某些情况下,你可能希望在一帧内进行多次物理模拟来实现特定的效果或精确度。关闭自动模拟并手动调用模拟可以实现这一点。
例子:
假设在游戏中,当玩家按下“P”键时,游戏会暂停,此时所有的物理活动也应该暂停。
void Update()
{
if (Input.GetKeyDown(KeyCode.P))

本文围绕Unity的Physics类展开,该类是Unity物理系统核心,提供处理和控制物理模拟的API。文章将其属性和方法按用途分类,详细介绍基础物理属性,如重力、碰撞检测设置等,还讲解射线投射和形状检测方法,如Linecast、Raycast等,后续章节将继续讲解剩余内容。
最低0.47元/天 解锁文章
35

被折叠的 条评论
为什么被折叠?



