版本:Unity 6 (6000.0)
语言中文
  • C#

Rigidbody2D.Slide

建议更改

成功!

感谢你帮助我们提高 Unity 文档的质量。虽然我们不能接受所有提交,但我们会阅读每个用户建议的更改,并在适用情况下进行更新。

关闭

提交失败

由于某种原因,无法提交你建议的更改。请在几分钟后重试。感谢你花时间帮助我们提高 Unity 文档的质量。

关闭

取消

声明

public Rigidbody2D.SlideResults Slide(Vector2 velocity, float deltaTime, Rigidbody2D.SlideMovement slideMovement);

参数

velocity Rigidbody2D 滑动时要使用的速度。
deltaTime 积分 velocity 所需的时间。
slideMovement 控制如何执行滑动的配置。

返回

SlideResults 滑动移动的结果。

说明

使用指定的 velocitydeltaTime 上积分,并使用 slideMovement 指定的配置在 Rigidbody2D 上滑动。

此方法的目的是使用最少的 API 来提供非常复杂的动作。动作包括在特定斜坡角度中滑动表面的动作、表面贴紧、重力以及在特定角度中的斜坡滑动动作。所有联系都会自动处理。此方法可以移动任何 主体类型Rigidbody2D,也可以立即改变位置,将位置更改推迟到仿真步骤,或仅返回已计算的位置。

以下是该机制的逻辑的完整分解

可以使用指定的 velocity 在指定的 deltaTime 上积分来移动 Rigidbody2D。发生这种情况时,与其他任何 Collider2D 的任何接触都将导致发生相应的方向(速度)改变,而不会出现摩擦或反弹。这种方向改变以及随后使用接触后的剩余速度继续运动被称为“滑动”。这是一种单次滑动迭代。“滑动”仅在表面的倾斜角度小于 Rigidbody2D.SlideMovement.surfaceSlideAngle 定义的角度时才会发生。允许的最大滑动迭代次数由 Rigidbody2D.SlideMovement.maxIterations 控制。

当幻灯片迭代发生时,用于执行移动的速度可能会导致 Rigidbody2DCollider2D 表面移开。如果幻灯片越过一个小斜坡或在沿着斜坡向下移动时偏离表面时,则可以发现这一点。通常,这不是预期行为,因此为了解决这个问题,可以在每次迭代中使用 Rigidbody2D.SlideMovement.surfaceAnchor 指定幻灯片迭代应查找表面的方向和距离。使用此方法,幻灯片可以永久“锚定”在表面上,即使速度正在使其远离表面。如果不需要此行为,则可以将 Rigidbody2D.SlideMovement.surfaceAnchor 设置为 Vector2.zero

幻灯片行为将使用多次迭代发生,直到满足以下两个条件之一

当幻灯片运动如上所述完成时,如果所提供的 Rigidbody2D.SlideMovement.gravity 向量的震级大于零,则将处理所要求的任何重力行为。在这种情况下,Rigidbody2D 将由 Rigidbody2D.SlideMovement.gravity 乘以所指定的 deltaTime 移动。如果重力运动导致接触到发现的物体,则 Rigidbody2D 将移动到该位置。

在此初始重力运动之后,可能会发生另一轮幻灯片迭代,以尝试使用所有剩余的重力运动。只有满足以下所有条件时,才会发生这种额外的重力幻灯片迭代(滑动)

  • 接触点是一个表面,其倾斜角度小于 Rigidbody2D.SlideMovement.gravitySlipAngle 所定义的滑动角。
  • 没有指定初始 velocity 即当请求移动而滑动不会抵消此移动时,不会滑动。

总之,使用重力调用幻灯片方法将导致 Rigidbody2D 随着重力移动,但如果没有指定 velocityRigidbody2D 将根据 Rigidbody2D.SlideMovement.surfaceSlipAngle 所指定的表面坡度阈值进行滑动。

当上述行为完成时,Rigidbody2D 的新位置已计算完成,但现阶段尚未实际移动此 Rigidbody2D。此处是 Rigidbody2D 在新位置即时定位或使用 Rigidbody2D.MovePosition 推迟移动的时机。此项操作通过 Rigidbody2D.SlideMovement.useSimulationMove 控制。启用后,可以使用 Rigidbody2D.MovePosition,而禁用后,Rigidbody2D 会立即设置在新位置。请注意,禁用 Rigidbody2D.SlideMovement.useSimulationMove 时,Rigidbody2DTransform 两者都会更新,且任何 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); } }