Давайте рассмотрим, что здесь происходит, вы запустите код и попросите своего игрока воспроизвести анимацию в одном кадре, а затем снова в другом и в следующем, пока нажата правильная клавиша или вы находитесь в правильном состоянии.
В чем проблема, проблема в том, что при каждом вызове функции воспроизведения она запускает анимацию снова и снова, поэтому просто перезапускается или выполняется другой вызов отдельно, и это вызывает неожиданное поведение.
Лучшим способом будет одновременное управление состоянием проигрывателя и проигрывателя анимации и использование этого для выполнения вызовов анимации.
enum State { IDLE, WALK, RUN, JUMP, INAIR, GROUNDED } ## This is to manage the player state
var my_state = State.IDLE ## Start the player with the idle state
Что касается состояния проигрывателя анимации, используйте сигнал, о котором вы говорили, используя графический интерфейс или код, подобный приведенному ниже.
get_node("Animation Player").connect("animation_finished", this, "method_name")
## Here I assume that you have the Animation Player as the Child of the Node you the script on
А также держите логическую переменную, чтобы узнать, воспроизводится ли анимация или нет.
if ( animation_not_playing and (case)):
animation_player.play("animation")
Поверните это правда или ложь по своему вкусу. На основании анимации закончен сигнал.
В будущем вы можете рассмотреть возможность использования даже простого FSM для сохранения всех этих данных и переменных состояния.