2
0
Эх сурвалжийг харах

Handle state machine travel before the start node is processed

This change allows travel() to be called on AnimationNodeStateMachinePlayback during _ready(), before the start node has been processed and the state machine is considered playing.
PouleyKetchoupp 5 жил өмнө
parent
commit
598d769804

+ 21 - 12
scene/animation/animation_node_state_machine.cpp

@@ -312,27 +312,36 @@ float AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_st
 	bool play_start = false;
 
 	if (start_request != StringName()) {
-
 		if (start_request_travel) {
 			if (!playing) {
-				String node_name = start_request;
-				start_request = StringName();
-				ERR_FAIL_V_MSG(0, "Can't travel to '" + node_name + "' if state machine is not playing.");
-			}
-
-			if (!_travel(p_state_machine, start_request)) {
-				//can't travel, then teleport
-				path.clear();
-				current = start_request;
+				if (!stop_request && p_state_machine->start_node) {
+					// can restart, just postpone traveling
+					path.clear();
+					current = p_state_machine->start_node;
+					playing = true;
+					play_start = true;
+				} else {
+					// stopped, invalid state
+					String node_name = start_request;
+					start_request = StringName(); //clear start request
+					ERR_FAIL_V_MSG(0, "Can't travel to '" + node_name + "' if state machine is not playing.");
+				}
+			} else {
+				if (!_travel(p_state_machine, start_request)) {
+					// can't travel, then teleport
+					path.clear();
+					current = start_request;
+				}
+				start_request = StringName(); //clear start request
 			}
 		} else {
+			// teleport to start
 			path.clear();
 			current = start_request;
 			playing = true;
 			play_start = true;
+			start_request = StringName(); //clear start request
 		}
-
-		start_request = StringName(); //clear start request
 	}
 
 	bool do_start = (p_seek && p_time == 0) || play_start || current == StringName();