优化移动平台与玩家的交互逻辑,采用速度双缓冲方案以提升运动平滑度和代码清晰度
This commit is contained in:
@@ -9,28 +9,30 @@ namespace BaseGames.Core
|
||||
///
|
||||
/// 协议(执行顺序保障):
|
||||
/// 1. MovingPlatform.FixedUpdate(-300)计算本帧期望位移 delta → 调用 SetPlatformDelta,
|
||||
/// 实现方将其累积到 _pendingPlatformDelta。
|
||||
/// 2. 实现方 FixedUpdate(-200)执行 _rb.position += _pendingPlatformDelta 并清零。
|
||||
/// 使用 Rigidbody2D.position(而非 transform.position):Unity 保证在 FixedUpdate 中
|
||||
/// 赋值时会同步更新插值参考点,不引起视觉抖动,与 RigidbodyInterpolation2D.Interpolate 兼容。
|
||||
/// 3. 状态机 FixedUpdate(-100)正常调用 Move(speedX);_rb.velocity.x 仅含玩家输入速度,
|
||||
/// UpdateFacing / ApplyAirDrag 无需减去任何平台速度,语义清晰。
|
||||
/// 4. 乘客离开传感器时 MovingPlatform 调用 OnLeavePlatform,继承完整平台速度(含水平),
|
||||
/// 保证从移动平台起跳时具有平台动量,手感自然。
|
||||
/// 实现方将其转换为速度(delta / fixedDeltaTime)存入下帧缓冲区。
|
||||
/// 2. 实现方 FixedUpdate(-200)将缓冲速度换入 _platformVelocity,清零缓冲区。
|
||||
/// 3. 状态机 FixedUpdate(-100)通过 Move(speedX) 将 _platformVelocity.x 叠加到 velocity,
|
||||
/// 与 RigidbodyInterpolation2D.Interpolate 完全兼容,无视觉抖动。
|
||||
/// _inputVelocityX(纯玩家输入)由 Move() 单独记录,UpdateFacing 读此值而非 velocity.x,
|
||||
/// 彻底避免平台速度污染朝向逻辑。
|
||||
/// 4. 乘客离开传感器时 MovingPlatform 调用 OnLeavePlatform,继承垂直速度分量;
|
||||
/// 水平分量已由最后一次 Move() 自然携带(包含 _platformVelocity.x),无需重复叠加。
|
||||
///
|
||||
/// 注意:不使用 _rb.position += delta 方案——Kinematic 平台通过 MovePosition 移动时,
|
||||
/// 物理引擎会通过接触力推动 Dynamic 乘客;若再手动写 position,等效于双重施加(2× 速度)。
|
||||
/// </summary>
|
||||
public interface IPassengerReceiver
|
||||
{
|
||||
/// <summary>
|
||||
/// 由 MovingPlatform 每帧推送本帧平台期望位移量。
|
||||
/// 实现方将其累积到内部字段,在自己的 FixedUpdate 中通过 Rigidbody2D.position
|
||||
/// 直接施加位移,不混入 velocity,保持玩家速度语义纯净。
|
||||
/// 实现方将其转换为速度(delta / fixedDeltaTime)存入缓冲区;
|
||||
/// 在自己的 FixedUpdate 换入后,由 Move() 叠加到 velocity.x,保持插值平滑。
|
||||
/// </summary>
|
||||
void SetPlatformDelta(Vector2 delta);
|
||||
|
||||
/// <summary>
|
||||
/// 乘客离开平台时调用,传入平台当前帧速度。
|
||||
/// 实现方应将完整平台速度(含水平)叠加到自身 velocity,
|
||||
/// 保证离台瞬间具有平台动量,手感自然。
|
||||
/// 实现方仅需继承垂直分量;水平分量已由最后一次 Move() 自然携带(包含平台 X 速度)。
|
||||
/// </summary>
|
||||
void OnLeavePlatform(Vector2 platformVelocity);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user