Bladeren bron

Check the seek process immediately after playback as a special case

Silc Lizard (Tokage) Renew 1 jaar geleden
bovenliggende
commit
c36200b9a1
2 gewijzigde bestanden met toevoegingen van 11 en 4 verwijderingen
  1. 10 4
      scene/animation/animation_player.cpp
  2. 1 0
      scene/animation/animation_player.h

+ 10 - 4
scene/animation/animation_player.cpp

@@ -151,7 +151,7 @@ void AnimationPlayer::_notification(int p_what) {
 			if (!Engine::get_singleton()->is_editor_hint() && animation_set.has(autoplay)) {
 				set_active(true);
 				play(autoplay);
-				seek(0, true);
+				_check_immediately_after_start();
 			}
 		} break;
 	}
@@ -522,8 +522,9 @@ void AnimationPlayer::seek(double p_time, bool p_update, bool p_update_only) {
 		return;
 	}
 
-	playback.current.pos = p_time;
+	_check_immediately_after_start();
 
+	playback.current.pos = p_time;
 	if (!playback.current.from) {
 		if (playback.assigned) {
 			ERR_FAIL_COND_MSG(!animation_set.has(playback.assigned), vformat("Animation not found: %s.", playback.assigned));
@@ -534,7 +535,6 @@ void AnimationPlayer::seek(double p_time, bool p_update, bool p_update_only) {
 		}
 	}
 
-	playback.started = false; // Start has already gone by seeking, delta does not need to be 0 in the internal process.
 	playback.seeked = true;
 	if (p_update) {
 		_process_animation(0, p_update_only);
@@ -543,10 +543,16 @@ void AnimationPlayer::seek(double p_time, bool p_update, bool p_update_only) {
 }
 
 void AnimationPlayer::advance(double p_time) {
-	playback.started = false; // Start has already gone by advancing, delta does not need to be 0 in the internal process.
+	_check_immediately_after_start();
 	AnimationMixer::advance(p_time);
 }
 
+void AnimationPlayer::_check_immediately_after_start() {
+	if (playback.started) {
+		_process_animation(0); // Force process current key for Discrete/Method/Audio/AnimationPlayback. Then, started flag is cleared.
+	}
+}
+
 bool AnimationPlayer::is_valid() const {
 	return (playback.current.from);
 }

+ 1 - 0
scene/animation/animation_player.h

@@ -111,6 +111,7 @@ private:
 	void _process_playback_data(PlaybackData &cd, double p_delta, float p_blend, bool p_seeked, bool p_started, bool p_is_current = false);
 	void _blend_playback_data(double p_delta, bool p_started);
 	void _stop_internal(bool p_reset, bool p_keep_state);
+	void _check_immediately_after_start();
 
 	bool playing = false;