Procházet zdrojové kódy

Merge pull request #34011 from nekomatata/state-machine-travel-on-ready

Handle state machine travel before the start node is processed
Rémi Verschelde před 5 roky
rodič
revize
5bf04d16f0
1 změnil soubory, kde provedl 21 přidání a 12 odebrání
  1. 21 12
      scene/animation/animation_node_state_machine.cpp

+ 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();