优化移动平台与乘客的速度继承逻辑,改用双缓冲方案以提升平滑度和兼容性
This commit is contained in:
@@ -9,11 +9,12 @@ namespace BaseGames.World
|
||||
/// <summary>
|
||||
/// 移动平台。Kinematic Rigidbody2D,支持三种移动模式。
|
||||
///
|
||||
/// 乘客跟随(Delta Position 方案,替代 SetParent):
|
||||
/// - PassengerSensor(Trigger)检测进入乘客(<see cref="IPassengerReceiver"/>)。
|
||||
/// - FixedUpdate(-300) 计算本帧期望位移 delta,推送给所有乘客,再执行 MovePosition。
|
||||
/// - 乘客在自己的 FixedUpdate(-200) 最前端消费 delta:_rb.position += delta。
|
||||
/// - 乘客离台时通过 OnLeavePlatform 继承平台速度,避免卡顿。
|
||||
/// 乘客跟随(Velocity 双缓冲方案):
|
||||
/// - PassengerSensor(Trigger)通过 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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user