class_name StateMachine extends Node @export var initialState: State = null @onready var state: State = (func getInitialState() -> State: return initialState if initialState != null else get_child(0) ).call() func ready() -> void: for stateNode: State in find_children("*", "State"): stateNode.finished.connect(transitionToNextState) await owner.ready state.enter("") func unhandledInput(event: InputEvent) -> void: state.handleInput(event) func process(delta: float) -> void: state.update(delta) func transitionToNextState(targetStatePath: String, data: Dictionary = {}) -> void: if not has_node(targetStatePath): printerr(owner.name + ": Trying to transition to state " + targetStatePath + " but it does not exist.") return var previousStatePath := state.name state.exit() state = get_node(targetStatePath) state.enter(previousStatePath, data)