人物控制器1

This commit is contained in:
2026-10-09 15:51:24 +08:00
parent d20d45fffc
commit 96e21757c3
6 changed files with 140 additions and 25 deletions
+13 -6
View File
@@ -46,10 +46,17 @@ const ANIM_LOOPED: Array[int] = [
@export_group("片段基准速度")
## 各片段在多少米/秒下按 1.0 倍播放。这是片段自身的属性,不是控制器的手感参数:
## 控制器把跑速调到 6 m/s 时,这段动画自然播成 1.2 倍,脚步自动跟上,两边不用对齐。
@export var walk_ref_speed: float = 5.0
@export var run_ref_speed: float = 8.5
@export var crouch_ref_speed: float = 2.5
@export var sneak_ref_speed: float = 1.6
##
## 注意:这几个数和「模型缩放」严格绑定 —— 角色尺寸一变,同一个片段一个循环跨出的
## 世界距离也按同比例变,所以基准速度必须跟着乘同一系数,否则脚步会明显打滑。
## 当前值对应 0.15 m 身高(基准系数 k ≈ 0.0857,推导见 player_motor.gd 顶部的说明)。
##
## sneak_ref_speed 要和 player_motor.gd 的 crouch_speed 保持一致 ——
## 蹲着走时播的就是 SNEAK 片段,两边不等就会打滑。(当前两者都是 0.2143)
@export var walk_ref_speed: float = 0.4286
@export var run_ref_speed: float = 0.7286
@export var crouch_ref_speed: float = 0.2143
@export var sneak_ref_speed: float = 0.2143
## 状态 → AnimationPlayer 里真正的片段键(形如 "walk/walk")。_ready() 里解析一次。
## 不直接拿 ANIM_CLIPS 的值去播,是因为多库时短名查不到 —— 见 _ready() 里的说明。
@@ -138,8 +145,8 @@ func _resolve_state(
velocity: Vector3, on_floor: bool, sprinting: bool, crouching: bool
) -> int:
if not on_floor:
# 上升用 jump、越过顶点用 fall。jump 片段长 0.5s,
# 恰好约等于 jump_velocity 5 / 重力 9.8 的上升时间。
# 上升用 jump、越过顶点用 fall。jump 片段长 0.5s,比「jump_velocity / 重力」
# 的上升时间略长,所以上升段不会播完 —— 越过顶点立刻切 fall,观感上是连贯的。
return AnimState.JUMP if velocity.y > 0.0 else AnimState.FALL
var moving := Vector2(velocity.x, velocity.z).length() >= idle_threshold
if crouching: