Какой способ выбрать
- AnimatedSprite2D — когда анимация состоит из готовых кадров: бег, прыжок, взрыв. Быстрее всего для пиксельной графики.
- AnimationPlayer — когда нужно анимировать свойства: позицию, поворот, цвет, видимость, вызов функции в нужный момент. Подходит и для кадров спрайт-листа, и для интерфейса, и для катсцен.
- AnimationTree — надстройка над AnimationPlayer для сложных переходов между состояниями. Понадобится позже.
Покадровая анимация через AnimatedSprite2D
Пиксельная графика после импорта может выглядеть размытой. Исправляется в Project Settings → Rendering → Textures → Canvas Textures → Default Texture Filter: Nearest.
Добавьте узел
В сцене персонажа замените Sprite2D на AnimatedSprite2D.
Создайте набор кадров
В инспекторе в поле Sprite Frames выберите New SpriteFrames и щёлкните по нему — внизу откроется панель SpriteFrames.
Загрузите кадры
Перетащите отдельные картинки в область кадров или нажмите кнопку загрузки из спрайт-листа и укажите число колонок и строк сетки.
Настройте анимацию
Переименуйте default в idle, добавьте новые анимации run и jump. Задайте FPS и включите или выключите повтор (Loop).
Включите автозапуск
Кнопка Autoplay on Load у анимации idle — она будет играть при старте.
Переключение анимаций из кода
В скрипте персонажа получите узел строкой @onready var sprite = $AnimatedSprite2D. В конце _physics_process выбирайте анимацию по состоянию: если персонаж не на полу — sprite.play("jump"), если скорость по X не равна нулю — sprite.play("run"), иначе sprite.play("idle").
Разворот в сторону движения — свойство flip_h: sprite.flip_h = velocity.x < 0. Вызов play с той же анимацией, что уже играет, её не перезапускает, поэтому писать так каждый кадр безопасно.
Анимация свойств через AnimationPlayer
Добавьте узел AnimationPlayer, внизу откроется панель Animation. Нажмите Animation → New и задайте имя, например blink. Выделите узел, который будете анимировать, и в инспекторе рядом с нужным свойством нажмите значок ключа — на таймлайн встанет ключевой кадр.
Сдвиньте курсор времени, измените значение свойства и поставьте второй ключ. Так делается мигание при получении урона через Modulate, выезжающая панель интерфейса или открывающаяся дверь. Запуск из кода — $AnimationPlayer.play("blink").
Если анимация не играет
- Имя в коде не совпадает с именем анимации — регистр букв важен.
- Анимация без Loop проигралась один раз и остановилась на последнем кадре.
- play вызывается каждый кадр с разными именами — анимации перебивают друг друга, проверьте условия.
- Ключи поставлены на другой узел: в AnimationPlayer путь к узлу указан относительно Root Node.
Когда нужен AnimationTree
Когда анимаций становится много — бег, прыжок, падение, атака, получение урона, — условия в коде превращаются в клубок. AnimationTree решает это машиной состояний: в редакторе рисуются состояния и стрелки переходов между ними, а в коде вы только меняете параметры, например скорость или флаг «на земле».
AnimationTree работает поверх AnimationPlayer, поэтому покадровые анимации придётся перенести в него: создайте в AnimationPlayer анимации, которые меняют свойство frame у Sprite2D или animation у AnimatedSprite2D. Для небольшой игры с тремя-четырьмя анимациями это избыточно — хватит переключения из скрипта.
Когда быстрее через ИИ-агента
ИИ-агент LeanTech напишет скрипт переключения анимаций под вашу логику персонажа, подскажет структуру AnimationTree и разберёт, почему анимация не запускается. Он же сгенерирует спрайты и иконки для 2D-игры картинками PNG.
Агент не работает внутри редактора Godot и не рисует 3D-анимации. Готовый спрайт-лист с ровной сеткой кадров для анимации ходьбы нейросеть делает не всегда — будьте готовы доработать кадры вручную.