优化移动平台与乘客的速度继承逻辑,改用双缓冲方案以提升平滑度和兼容性

This commit is contained in:
2026-05-21 18:59:22 +08:00
parent 247a218182
commit c7c8171b8a
3 changed files with 52 additions and 30 deletions

View File

@@ -9,11 +9,12 @@ namespace BaseGames.World
/// <summary>
/// 移动平台。Kinematic Rigidbody2D支持三种移动模式。
///
/// 乘客跟随(Delta Position 方案,替代 SetParent
/// - PassengerSensorTrigger检测进入乘客(<see cref="IPassengerReceiver"/>)。
/// - FixedUpdate(-300) 计算本帧期望位移 delta,推送给所有乘客,再执行 MovePosition
/// - 乘客在自己的 FixedUpdate(-200) 最前端消费 delta_rb.position += delta
/// - 乘客离台时通过 OnLeavePlatform 继承平台速度,避免卡顿
/// 乘客跟随(Velocity 双缓冲方案
/// - PassengerSensorTrigger通过 attachedRigidbody 检测乘客(<see cref="IPassengerReceiver"/>)。
/// - FixedUpdate(-300) 计算本帧期望位移 delta → SetPlatformDelta(delta) 写入乘客缓冲区
/// - 乘客 FixedUpdate(-200) 换入缓冲速度;状态机 FixedUpdate(-100) 的 Move() 将其叠加到 velocity
/// - 基于 velocity 驱动,与 RigidbodyInterpolation2D.Interpolate 完全兼容,无视觉抖动
/// - 乘客离台时 OnLeavePlatform 继承垂直速度分量;水平分量已由 Move() 自然携带。
///
/// 此方案不修改 Transform 层级,与动画/摄像机/HitBox 系统完全兼容。
/// </summary>
@@ -143,17 +144,20 @@ namespace BaseGames.World
private void OnTriggerEnter2D(Collider2D other)
{
if (!IsPassengerLayer(other)) return;
if (!other.TryGetComponent<IPassengerReceiver>(out var receiver)) return;
// attachedRigidbody若玩家碰撞体在子对象上也能正确找到根对象上的 IPassengerReceiver
if (!other.attachedRigidbody) return;
if (!other.attachedRigidbody.TryGetComponent<IPassengerReceiver>(out var receiver)) return;
if (!_passengers.Contains(receiver))
_passengers.Add(receiver);
}
private void OnTriggerExit2D(Collider2D other)
{
if (!other.TryGetComponent<IPassengerReceiver>(out var receiver)) return;
if (!other.attachedRigidbody) return;
if (!other.attachedRigidbody.TryGetComponent<IPassengerReceiver>(out var receiver)) return;
if (!_passengers.Remove(receiver)) return;
// 继承平台速度,防止离台时速度骤变卡顿
// 继承平台垂直速度;水平速度已由 IPassengerReceiver.Move() 自然携带,无需重复叠加
receiver.OnLeavePlatform(_frameVelocity);
}