Files
agame/character/player/hsm/grounded.gd
T
2026-10-15 16:56:45 +08:00

46 lines
1.7 KiB
GDScript

extends LimboHSM
## 地面子机(挂在 HSM/Grounded 上)。
##
## 五个叶子状态:
## Idle 站立不动 Walk 步行 Sprint 疾跑 Crouch 原地蹲 Sneak 蹲走
## 叶子各自的输入转换见 ground_state.gd 及各状态脚本;本机只注册转换表,
## 并在 _enter(首次激活 / 每次落地)时按「当下输入」挑初始子状态 ——
## 不然按着方向键落地会先闪一帧站立。
@onready var idle: LimboState = $Idle
@onready var walk: LimboState = $Walk
@onready var sprint: LimboState = $Sprint
@onready var crouch: LimboState = $Crouch
@onready var sneak: LimboState = $Sneak
func _setup() -> void:
# 事件口径:move_start/stop 有无方向输入,sprint_start/stop 疾跑键,
# crouch_start/end 蹲键。蹲伏优先于疾跑(蹲下时按 Shift 不算疾跑)。
add_transition(idle, walk, &"move_start")
add_transition(idle, crouch, &"crouch_start")
add_transition(walk, idle, &"move_stop")
add_transition(walk, sprint, &"sprint_start")
add_transition(walk, sneak, &"crouch_start")
add_transition(sprint, walk, &"sprint_stop")
add_transition(sprint, idle, &"move_stop")
add_transition(sprint, sneak, &"crouch_start")
add_transition(crouch, sneak, &"move_start")
add_transition(crouch, idle, &"crouch_end")
add_transition(sneak, crouch, &"move_stop")
add_transition(sneak, walk, &"crouch_end")
func _enter() -> void:
var player := get_agent() as Player
if player == null:
set_initial_state(idle)
return
var moving := player.motor.has_move_input()
if Input.is_action_pressed("crouch"):
set_initial_state(sneak if moving else crouch)
elif moving:
set_initial_state(sprint if Input.is_action_pressed("sprint") else walk)
else:
set_initial_state(idle)