using UnityEngine; namespace BaseGames.Player { [CreateAssetMenu(menuName = "BaseGames/Player/MovementConfig")] public class PlayerMovementConfigSO : ScriptableObject { [Header("地面移动")] public float RunSpeed = 7f; [Header("空中移动")] [Tooltip("无水平输入时每个 FixedUpdate 帧水平速度的保留比例(0~1)。" + "0.92 ≈ 半衰期 0.17s(50Hz),松开方向键后空中动量自然衰减。")] [Range(0f, 1f)] public float AirDragFactor = 0.92f; [Header("跳跃")] [Tooltip("一段跳初速度。推荐 18-20,对应 ~4-5 格高度。")] public float JumpForce = 19f; [Tooltip("按住跳跃键可保持的郊狼时间。推荐 0.12s。")] public float CoyoteTime = 0.12f; [Tooltip("下落阶段额外重力倍率。推荐 3.5,使下落比上升更快、手感更紧实。")] public float FallGravityMult = 3.5f; [Tooltip("最大下落速度(终端速度)。推荐 22。")] public float MaxFallSpeed = 22f; [Tooltip("松开跳跃键时速度保留比例(变高跳)。推荐 0.35,越小跳跃越低。")] [Range(0f, 1f)] public float JumpCutMultiplier = 0.35f; [Header("跳跃 — 顶点悬停")] [Tooltip("顶点悬停触发阈值(单位/秒)。当 |垂直速度| 低于此值时,重力缩减为 ApexGravityMultiplier 倍,\n产生\"滞空感\"。推荐 3。调高 → 悬停段更长;调低 → 悬停段更短乃至消失。")] public float ApexThreshold = 3f; [Tooltip("顶点区间内重力缩减比例(乘以 DefaultGravityScale)。推荐 0.3。\n0 = 完全无重力悬停;1 = 无悬停效果(等同于关闭此功能)。")] [Range(0f, 1f)] public float ApexGravityMultiplier = 0.3f; [Header("空中跳跃(N 段跳)")] [Tooltip("腾空期间最多可追加的跳跃次数。1 = 二段跳,2 = 三段跳,以此类推。\n需同时在 PlayerStats 中解锁 DoubleJump 能力,否则此值无效。")] public int MaxAirJumps = 1; [Tooltip("空中追加跳跃的初速度。所有段数共用同一数值;设为与 JumpForce 相同可获得等高多段跳。")] public float DoubleJumpForce = 19f; [Header("冲刺")] [Tooltip("冲刺速度(单位/秒)。推荐 25,在 0.35s 内约穿越 7-8 格。")] public float DashSpeed = 25f; [Tooltip("冲刺持续时长(秒)。推荐 0.35s。")] public float DashDuration = 0.35f; [Tooltip("冲刺冷却时长(秒)。推荐 0.6s,落地后才可再次冲刺。")] public float DashCooldown = 0.6f; [Header("冲刺无敌帧(窗口 < 冲刺时长,且有独立 CD)")] [Tooltip("冲刺无敌窗口时长(秒)。仅为冲刺前段;窗口结束后即使仍在冲刺中也可受伤被打断(推荐 0.20s)。")] public float DashInvincibilityDuration = 0.20f; [Tooltip("无敌的独立冷却(秒)。CD 内再次冲刺不会获得无敌帧,防止连冲变相持续无敌(推荐 0.9s)。")] public float DashInvincibilityCooldown = 0.9f; [Header("抓墙 / 壁滑")] [Tooltip("受限抓墙时(高于 wallGrabY)的下滑速度(单位/秒)。推荐 2。")] public float WallSlideSpeed = 2f; public float WallRayLength = 0.55f; public float WallRayOffsetY = 0.2f; [Tooltip("抓墙高度容差:当前 Y 不超过 wallGrabY + 此值时视为未抬升,防止浮点抖动误判。")] public float WallGrabHeightTolerance = 0.05f; [Header("蹬墙跳 — 背墙跳(Jump Away,远离墙壁斜上方)")] [Tooltip("背墙跳水平速度(远离墙壁方向)。推荐 14。")] public float WallJumpAwayForceX = 14f; [Tooltip("背墙跳垂直速度。推荐 18。")] public float WallJumpAwayForceY = 18f; [Header("蹬墙跳 — 对墙跳(Jump Toward,沿墙壁斜上方)")] [Tooltip("对墙跳水平速度(朝向墙壁方向,较小)。推荐 6。")] public float WallJumpTowardForceX = 6f; [Tooltip("对墙跳垂直速度(偏向正上方)。推荐 18。")] public float WallJumpTowardForceY = 18f; [Header("蹬墙跳 — 公共")] [Tooltip("蹬墙跳后水平输入锁定时长(秒)。防止玩家立即向原墙壁方向输入取消起跳。推荐 0.15。")] public float WallJumpInputLockDuration = 0.15f; [Header("重力")] public float DefaultGravityScale = 3f; } }