velocity | 当 Rigidbody2D 滑动时要使用的速度。 |
deltaTime | 积分 velocity 所需的时间。 |
slideMovement | 控制如何执行滑动的配置。 |
SlideResults 滑动移动的结果。
使用指定的 velocity
在 deltaTime
上积分,并使用 slideMovement
指定的配置在 Rigidbody2D 上滑动。
此方法的目的是使用最少的 API 来提供非常复杂的动作。动作包括在特定斜坡角度中滑动表面的动作、表面贴紧、重力以及在特定角度中的斜坡滑动动作。所有联系都会自动处理。此方法可以移动任何 主体类型 的 Rigidbody2D,也可以立即改变位置,将位置更改推迟到仿真步骤,或仅返回已计算的位置。
以下是该机制的逻辑的完整分解
可以使用指定的 velocity
在指定的 deltaTime
上积分来移动 Rigidbody2D。发生这种情况时,与其他任何 Collider2D 的任何接触都将导致发生相应的方向(速度)改变,而不会出现摩擦或反弹。这种方向改变以及随后使用接触后的剩余速度继续运动被称为“滑动”。这是一种单次滑动迭代。“滑动”仅在表面的倾斜角度小于 Rigidbody2D.SlideMovement.surfaceSlideAngle 定义的角度时才会发生。允许的最大滑动迭代次数由 Rigidbody2D.SlideMovement.maxIterations 控制。
当幻灯片迭代发生时,用于执行移动的速度可能会导致 Rigidbody2D 从 Collider2D 表面移开。如果幻灯片越过一个小斜坡或在沿着斜坡向下移动时偏离表面时,则可以发现这一点。通常,这不是预期行为,因此为了解决这个问题,可以在每次迭代中使用 Rigidbody2D.SlideMovement.surfaceAnchor 指定幻灯片迭代应查找表面的方向和距离。使用此方法,幻灯片可以永久“锚定”在表面上,即使速度正在使其远离表面。如果不需要此行为,则可以将 Rigidbody2D.SlideMovement.surfaceAnchor 设置为 Vector2.zero。
幻灯片行为将使用多次迭代发生,直到满足以下两个条件之一
deltaTime
上 velocity
(速度)的大小定义)。当幻灯片运动如上所述完成时,如果所提供的 Rigidbody2D.SlideMovement.gravity 向量的震级大于零,则将处理所要求的任何重力行为。在这种情况下,Rigidbody2D 将由 Rigidbody2D.SlideMovement.gravity 乘以所指定的 deltaTime
移动。如果重力运动导致接触到发现的物体,则 Rigidbody2D 将移动到该位置。
在此初始重力运动之后,可能会发生另一轮幻灯片迭代,以尝试使用所有剩余的重力运动。只有满足以下所有条件时,才会发生这种额外的重力幻灯片迭代(滑动)
velocity
即当请求移动而滑动不会抵消此移动时,不会滑动。总之,使用重力调用幻灯片方法将导致 Rigidbody2D 随着重力移动,但如果没有指定 velocity
,Rigidbody2D 将根据 Rigidbody2D.SlideMovement.surfaceSlipAngle 所指定的表面坡度阈值进行滑动。
当上述行为完成时,Rigidbody2D 的新位置已计算完成,但现阶段尚未实际移动此 Rigidbody2D。此处是 Rigidbody2D 在新位置即时定位或使用 Rigidbody2D.MovePosition 推迟移动的时机。此项操作通过 Rigidbody2D.SlideMovement.useSimulationMove 控制。启用后,可以使用 Rigidbody2D.MovePosition,而禁用后,Rigidbody2D 会立即设置在新位置。请注意,禁用 Rigidbody2D.SlideMovement.useSimulationMove 时,Rigidbody2D 和 Transform 两者都会更新,且任何 Rigidbody2D 插值都会按预期继续执行。
其余配置选项允许对滑动功能进行更详细的控制。这些选项包括:
注意:可在任何 RigidbodyType2D 上使用滑动方法,但主要旨在 Rigidbody2D 为运动学时使用。任何主体类型都不会干扰滑动方法,但使用动态模式可能会产生意外结果,因为此类 Rigidbody2D 可能具有自己的重力、力、碰撞响应等。使用任何主体类型(运动学、静态或动态)都不会造成性能损失,而且如有需要,所有主体类型都有效。动态主体类型只是需要小心配置,以使其自身特性不会导致产生冲突和意外的移动行为。
以下代码使用简单的左右键盘输入来设置相应的相对速度。滑动方法将使用 SlideMovement 中指定配置滑动 Rigidbody2D,并将滑动结果保存在 SlideResults 中
using UnityEngine;
public class Example : MonoBehaviour { public Rigidbody2D.SlideMovement SlideMovement = new Rigidbody2D.SlideMovement(); public Rigidbody2D.SlideResults SlideResults;
public float HorizontalSpeed = 2f;
private Rigidbody2D m_Rigidbody;
void Start() { m_Rigidbody = GetComponent<Rigidbody2D>(); }
void Update() { // Calculate the horizontal velocity from keyboard input. var horizontalInput = (Input.GetKey(KeyCode.LeftArrow) ? -1 : 0f) + (Input.GetKey(KeyCode.RightArrow) ? 1f : 0f); var velocity = new Vector2(horizontalInput * HorizontalSpeed, 0f);
// Slide the rigidbody. SlideResults = m_Rigidbody.Slide(velocity, Time.deltaTime, SlideMovement); } }