Гид по технологиям

Добавление 2D-анимаций в Godot: практическое руководство

7 min read Разработка игр Обновлено 29 Mar 2026
2D-анимации в Godot: быстрое руководство
2D-анимации в Godot: быстрое руководство

человек анимирует объекты на компьютере

Анимации — ключевой элемент 2D-игр: они делают персонажей живыми, улучшают подачу игрового процесса и дают визуальную обратную связь игроку. Godot включает удобные инструменты для создания и управления 2D-анимациями через узел AnimatedSprite и систему сигналов. Ниже — пошаговое руководство и набор практических материалов, которые помогут быстро внедрить анимации в ваш проект.

Почему это важно

  • Анимации повышают восприятие отклика от игрока и улучшают игровой ритм.
  • Правильные сигналы и контроль анимаций упрощают управление состояниями (idle, walk, attack).
  • Производительность и организация ассетов критичны в мобильных и веб-проектах.

Содержание

  1. Подготовка 2D-сцены
  2. Добавление SpriteSheet и настройка SpriteFrames
  3. Управление анимацией через GDScript
  4. Поворот и зеркалирование
  5. Сигналы AnimatedSprite
  6. Шаблоны, чек-листы и тесты
  7. Дополнительные практики и рекомендации
  8. Краткое резюме

1. Подготовка Godot-сцены

Создайте новую 2D-сцену и добавьте KinematicBody2D как узел игрока. Внутри него поместите CollisionShape2D с прямоугольной формой, которая будет границей коллизии персонажа.

Важно: разнесите визуальные узлы (Sprite/AnimatedSprite) и физические узлы (CollisionShape2D) по иерархии так, чтобы трансформации не конфликтовали с коллизией.

Код, используемый в статье, доступен в репозитории на GitHub и распространяется по лицензии MIT (ссылка в исходном материале).

Также добавьте узел AnimatedSprite для анимаций персонажа.

Настройте Input Map в Godot и добавьте действия, которые будут использоваться для управления:

карта ввода с разными клавишами в Godot

Пример простого скрипта движения (поместите в KinematicBody2D):

extends KinematicBody2D  
  
const SPEED = 200  
  
func _physics_process(delta):  
    var velocity = Vector2.ZERO  
    if Input.is_action_pressed("move_left"):  
        velocity.x -= SPEED  
    if Input.is_action_pressed("move_right"):  
        velocity.x += SPEED  
    if Input.is_action_pressed("move_up"):  
        velocity.y -= SPEED  
    if Input.is_action_pressed("move_down"):  
        velocity.y += SPEED  
    velocity = move_and_slide(velocity)

Этот код задаёт постоянную скорость и позволяет перемещать персонажа в четырёх направлениях. Код оставлен без изменений для точности и совместимости.

простая модель игрока в Godot

2. Добавление SpriteSheet в AnimatedSprite

  1. Выберите узел AnimatedSprite.
  2. В свойствах в разделе Frames нажмите New SpriteFrames.
  3. Откройте вкладку SpriteFrames внизу редактора.
  4. Нажмите New Animation и создайте анимации, например walk и idle.
  5. Нажмите Add Frames from SpriteSheet, чтобы автоматически разрезать спрайтшит на фреймы.

Советы по организации:

  • Именуйте анимации по действиям: idle, walk, run, attack, jump.
  • Используйте одинаковую высоту/ширину фреймов в спрайтшите для удобства автоматической нарезки.
  • Храните спрайтшиты и отдельные SpriteFrames в подпапках проекта: res://assets/sprites/player/.

раздел SpriteFrames с кадрами в Godot

3. Управление анимацией через GDScript

Контроль воспроизведения анимаций нужен для синхронизации состояний персонажа с вводом и событиями игры.

Воспроизведение и остановка анимации

Используйте методы play() и stop() у узла AnimatedSprite. Ниже — пример обработки входных событий для воспроизведения и остановки:

extends KinematicBody2D  
  
func _physics_process(delta):  
    # Play the animation   
    if Input.is_action_just_pressed("play_animation"):  
        $AnimatedSprite.play()  
      
    # Stop the animation and reset to the first frame   
    if Input.is_action_just_pressed("stop_animation"):  
        $AnimatedSprite.stop()  
        $AnimatedSprite.frame = 0

Совет: вместо прямого вызова play() можно явно указать имя анимации: $AnimatedSprite.play(“walk”). Это уменьшит вероятность ошибки, если в SpriteFrames добавятся другие анимации.

Примеры использования:

  • Вход в состояние атаки: остановить текущую и запустить “attack”.
  • При загрузке уровня поставить idle по умолчанию.

Поворот анимации

Поворот всего узла AnimatedSprite осуществляется методом rotate(), который принимает угол в радианах. Для удобства используйте deg2rad():

extends KinematicBody2D  
  
func _physics_process(delta):  
    if Input.is_action_just_pressed("rotate_animation"):  
        # Rotate the animation by 45 degrees clockwise  
        $AnimatedSprite.rotate(deg2rad(45))

Важно: rotate() поворачивает узел целиком — все кадры, коллайдеры и дочерние узлы. Если вам нужно поворачивать только изображение, используйте внутренний Sprite внутри CanvasItem или отдельные AnimatedSprite узлы для разных ориентаций.

повёрнутая анимация персонажа в Godot

Зеркалирование анимации

Для отражения по горизонтали и вертикали используйте свойства flip_h и flip_v:

extends KinematicBody2D  
  
func _physics_process(delta):  
    if Input.is_action_just_pressed("flip_animation"):  
        $AnimatedSprite.flip_h = true  
        # or $AnimatedSprite.flip_v = true for vertical flipping

Практическое применение: зеркалирование удобно для смены направления персонажа при движении влево/вправо без создания дополнительных анимаций.

4. Сигналы AnimatedSprite

Godot предоставляет сигналы для реакции на события анимации. Два ключевых сигнала — animation_finished и frame_changed.

animation_finished

Этот сигнал испускается, когда анимация достигает последнего кадра.

extends KinematicBody2D  
  
func _ready():  
    $AnimatedSprite.connect("animation_finished", self, "_on_animation_finished")  
  
func _on_animation_finished():  
    # Perform actions or trigger events  
    print("Animation finished!")  
    # Additional code here...

Типичные сценарии:

  • Завершение атаки — переключение на idle и нанесение урона в момент окончания анимации.
  • Одноразовые VFX — удалить узел после окончания анимации.

frame_changed

Сигнал испускается при каждом изменении кадра. Это полезно для синхронизации звуков, частиц или коллизий с конкретными кадрами:

extends KinematicBody2D  
  
func _ready():  
    $AnimatedSprite.connect("frame_changed", self, "_on_frame_changed")  
  
func _on_frame_changed():  
    # Perform actions based on the current frame  
    var currentFrame = $AnimatedSprite.frame  
    print("Current frame: ", currentFrame)  
    # Additional code here...

Пример: на 3-м кадре удара включить проверку попадания по врагу.

5. Практики оптимизации и производительности

  • Старайтесь использовать один спрайтшит на меш персонажа (атлас текстур) — это уменьшит количество переключений текстур и улучшит рендер.
  • Для мобильных устройств используйте сжатие текстур и уменьшение разрешения фреймов.
  • Избегайте создания большого количества AnimatedSprite узлов без явной необходимости — вместо этого используйте один узел с несколькими анимациями.
  • Для VFX применяйте короткие анимации и освобождайте узлы через queue_free() после окончания.

Важно: профилируйте игру на целевых устройствах — оптимизации зависят от платформы.

6. Чек-листы и роли (кто за что отвечает)

Разделенные роли ускоряют работу и снижают ошибки при интеграции анимаций.

  • Художник (Artist):

    • Подготовить спрайтшиты с ровными ячейками.
    • Указать pivot/anchor для каждого кадра.
    • Пометить версии ассетов и места использования.
  • Программист (Developer):

    • Подключить AnimatedSprite и настроить SpriteFrames.
    • Реализовать управление состояниями (state machine) через GDScript.
    • Подключить сигналы animation_finished и frame_changed.
  • QA / Тестировщик:

    • Проверить синхронизацию звука и кастомных событий на кадрах.
    • Тестировать производительность на минимальных целевых устройствах.
    • Проверить переходы между анимациями без визуальных «прыжков».

7. Мини-методология внедрения анимаций (шаги)

  1. Соберите требования: какие состояния нужны (idle, walk, run, jump, attack).
  2. Подготовьте спрайтшит и организуйте фреймы в SpriteFrames.
  3. Настройте Input Map и базовое движение персонажа.
  4. Свяжите состояния с анимациями: реализуйте простой state machine.
  5. Подключите сигналы для событий (звук, урон, VFX).
  6. Протестируйте переходы и оптимизируйте производительность.

8. Шаблоны кода и шпаргалка

Чек-лист быстрого запуска AnimatedSprite:

  • AnimatedSprite -> Frames -> New SpriteFrames
  • SpriteFrames -> New Animation -> Add Frames from SpriteSheet
  • Убедитесь, что анимация имеет правильный FPS (fps в настройках SpriteFrames)
  • Подключите сигналы через _ready() или через инспектор

Часто используемые вызовы:

  • $AnimatedSprite.play(“walk”)
  • $AnimatedSprite.stop()
  • $AnimatedSprite.frame = 0
  • $AnimatedSprite.flip_h = true
  • $AnimatedSprite.rotate(deg2rad(90))

Рекомендации по именованию: используйте латинские или английские имена состояний в SpriteFrames для совместимости с кодом (например “idle”, “walk”).

9. Решение типичных проблем (когда что-то не работает)

  • Анимация не отображается: проверьте, что у AnimatedSprite выбран Frame и что SpriteFrames реально содержит кадры.
  • Неправильный pivot: убедитесь, что pivot/offset одинаков для всех кадров или установите родительский узел для корректной трансформации.
  • Звук не совпадает с кадром: используйте сигнал frame_changed и запускайте звук на нужном кадре.
  • Падение FPS при множестве анимаций: объедините текстуры в атлас и сократите разрешение.

10. Тесты и критерии приёмки

Критерии приёмки для базовой интеграции:

  • Персонаж имеет рабочие состояния idle и walk, переключение между ними без визуальных разрывов.
  • Атака проигрывается полностью и испускает animation_finished при завершении.
  • При зеркалировании персонаж корректно меняет направление, не смещая коллайдер.
  • Тесты на целевых устройствах показывают стабильный FPS в игровой сцене (по согласованным нормам проекта).

Тест-кейсы (пример):

  • Нажать кнопку движения вправо: анимация walk должна играть, flip_h == false.
  • Нажать кнопку движения влево: aнимация walk должна играть, flip_h == true.
  • Вызвать play(“attack”): анимация attack играет до конца, затем испускается animation_finished.

11. Ментальные модели и эвристики

  • State machine: представьте поведение персонажа в виде конечного автомата — каждая анимация соответствует состоянию.
  • Single source of truth: источник текущего состояния должен быть один (например, переменная state в скрипте), чтобы избежать конфликтующих вызовов play/stop.
  • Visual first: при сомнении в плавности переходов делайте небольшие переходные кадры (blend frames) в спрайтшите.

12. Краткое резюме

Добавление 2D-анимаций в Godot проходит через подготовку спрайтшитов, настройку AnimatedSprite и управление через GDScript. Сигналы animation_finished и frame_changed позволяют синхронизировать логику игры с кадрами анимации. Организация ассетов, чек-листы ролей и минимальный набор тестов помогут поддерживать качество и производительность.

Важно: не забывайте профилировать игру на целевых устройствах и оптимизировать текстуры и количество узлов.


Заметки:

  • Important: оставляйте комментарии и именованные анимации в SpriteFrames для команды.
  • Note: протестируйте зеркалирование и поворот на ваших графических ассетах — иногда требуется отдельная версия спрайтов для корректного отображения.

1-строчный глоссарий:

  • AnimatedSprite — узел Godot для кадровой 2D-анимации.
  • SpriteFrames — ресурс, содержащий набор анимаций и кадров для AnimatedSprite.
  • animation_finished — сигнал, испускаемый по завершении анимации.
  • frame_changed — сигнал при смене кадра.

Если нужно, я могу подготовить: простую state machine на GDScript, шаблон папок ассетов для команды, или Mermaid-диаграмму состояний для вашей игры.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как отменить резервирование обновления до Windows 10
Windows

Как отменить резервирование обновления до Windows 10

JUnit Assertions: методы и примеры
Software Testing

JUnit Assertions: методы и примеры

Создать базу KeePass и экстренный лист
Безопасность

Создать базу KeePass и экстренный лист

Запись экрана Android на Mac — AndroidTool
How-to

Запись экрана Android на Mac — AndroidTool

Шаблоны Bullet Journal: цифровые и печатные
Продуктивность

Шаблоны Bullet Journal: цифровые и печатные

Блокировать отслеживание соцсетей и рекламы
Конфиденциальность

Блокировать отслеживание соцсетей и рекламы