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)