class_name StateMachine extends Node # Emitted when transitioning to a new state. signal transitioned(state_name) # Path to the initial active state. We export it to be able to pick the initial state in the inspector. export var initial_state := NodePath() # The current active state. At the start of the game, we get the `initial_state`. onready var state: State = get_node(initial_state) func _ready() -> void: yield(owner, "ready") # The state machine assigns itself to the State objects' state_machine property. for child in get_children(): child.state_machine = self state.enter() func _process(delta: float) -> void: state.update(delta) func _physics_process(delta: float) -> void: state.physics_update(delta) func transition_to(target_state_name: String, msg: Dictionary = {}) -> void: if not has_node(target_state_name): print("no state") return state.exit() state = get_node(target_state_name) state.enter(msg) emit_signal("transitioned", state.name)