~3 мин чтения

Анимация — AnimationPlayer и AnimationTree

AnimationLibrary, state machine, blend spaces, root motion.

AnimationPlayer — главный узел

AnimationPlayer хранит AnimationLibrary с набором Animation-ресурсов и проигрывает их. Уникальная особенность Godot — можно анимировать любое свойство любого узла (или даже ресурса), не только Transform и Material:

  • Transform (position, rotation, scale)
  • Любое property (alpha sprite, visible, числа, цвета)
  • Shader uniforms — через property path material:shader_parameter/threshold
  • Метод-вызовы (по таймеру в треке вызвать функцию)
  • Audio (запустить AudioStreamPlayer)
  • Вложенные анимации других AnimationPlayer
Player (Node3D)
├── Skeleton3D
│   └── MeshInstance3D
└── AnimationPlayer        ← здесь все клипы: Idle, Run, Jump, Attack
$AnimationPlayer.play("Run")
$AnimationPlayer.play("Jump", -1, 1.2)   # blend_time=-1, speed=1.2
$AnimationPlayer.speed_scale = 0.5        # все клипы замедлены вдвое
$AnimationPlayer.stop()
$AnimationPlayer.seek(0.5, true)          # перемотать в 0.5 с

# Сигнал об окончании
$AnimationPlayer.animation_finished.connect(_on_anim_done)
Веб

GSAP / Framer Motion timeline: вы описываете треки на свойствах элементов с keyframes, время управляет анимацией.

Unity

Unity Animation Window — то же ощущение записи треков по timeline’у. Но Unity Animator Controller — отдельный state-machine ассет. В Godot его аналог — AnimationTree, и он привязан к одному AnimationPlayer.

Запись анимации в редакторе

  1. Выберите AnimationPlayer в сцене → внизу появится Animation editor.
  2. Кнопка “Animation” → New → имя.
  3. Включите красную точку (Recording) → измените любое свойство в Inspector → keyframe создастся автоматически в текущей точке таймлайна.
  4. Прокрутите таймлайн → измените снова → второй keyframe.

Также треки добавляются вручную через “Add Track”.

AnimationTree — state machine и blendspace

Для сложной анимации (locomotion, переходы) используется AnimationTree — отдельный узел, который читает анимации из связанного AnimationPlayer и обрабатывает их через граф нод:

Player (Node3D)
├── AnimationPlayer
└── AnimationTree         ← root: AnimationNodeStateMachine
                              tree_root указывает на корневой граф
                              anim_player указывает на AnimationPlayer

Корневой граф AnimationTree — это AnimationNode. Виды:

  • AnimationNodeStateMachine — FSM с состояниями и переходами.
  • AnimationNodeBlendTree — граф для смешивания.
  • AnimationNodeBlendSpace1D — 1D-параметрический блендинг (например, speed 0..6 ↔ Idle ↔ Walk ↔ Run).
  • AnimationNodeBlendSpace2D — 2D (например, strafe_x, forward_y для 8-направленного движения).
  • AnimationNodeAdd2/3 — наложение поз.
  • AnimationNodeOneShot — однократное воспроизведение поверх (например, “выстрел” поверх ходьбы).
  • AnimationNodeTimeScale / TimeSeek.

Состояния через StateMachine

@onready var anim_tree: AnimationTree = $AnimationTree
@onready var state_machine = anim_tree["parameters/playback"]  # AnimationNodeStateMachinePlayback

func _ready() -> void:
    anim_tree.active = true

func _process(delta: float) -> void:
    var speed = velocity.length()
    anim_tree["parameters/Move/blend_position"] = speed  # 1D blendspace

    if Input.is_action_just_pressed("jump"):
        state_machine.travel("Jump")  # умный переход через граф (A* find path)

travel("StateName") — главная фишка Godot StateMachine: ищет короткий путь через переходы. Из Idle хочется в Land? Если нет прямой стрелки, Godot найдёт Idle → Run → Land и пройдёт.

parameters — это словарь

AnimationTree предоставляет все настраиваемые параметры графа через subscript-нотацию по строке. anim_tree["parameters/Locomotion/blend_position"] — путь в графе. Хеширование путей при частом доступе можно делать через var path = "parameters/...": константу.

Root Motion

Если в анимации скелет двигается (“шаг вперёд”) — по умолчанию AnimationPlayer не двигает GameObject. Только меняет позы. Для перевода смещения скелета в реальное движение узла:

  1. На AnimationTree укажите root_motion_track — путь к корневой кости (Skeleton3D:Hips).
  2. В скрипте читайте anim_tree.get_root_motion_position() и применяйте к узлу:
func _physics_process(delta: float) -> void:
    var motion = anim_tree.get_root_motion_position()
    velocity = transform.basis * motion / delta
    move_and_slide()

Когда не использовать root motion: классические FPS/платформеры, где скорость считается логикой. Используют для cinematic-движений, грэпплов, добиваний.

Skeleton3D, Bones, Bone Attachment

Skeleton3D — иерархия костей. Применяется к скиннингу MeshInstance3D через Skin-ресурс.

BoneAttachment3D — узел, который следует за кости́ю. Прикрепляете к нему оружие, аксессуары:

Player
├── Skeleton3D
│   ├── MeshInstance3D (skinned)
│   └── BoneAttachment3D (bone_name = "RightHand")
│       └── Sword (Node3D + MeshInstance3D)

IK — Inverse Kinematics

В 4.6 IK вернулся в форме нодов-солверов внутри Skeleton3D (узлы-наследники SkeletonModifier3D):

  • TwoBoneIK3D — два звена (рука/нога) с целевой позицией.
  • FABRIK3D — Forward And Backward Reaching IK (несколько звеньев).
  • CCDIK3D — Cyclic Coordinate Descent.
  • ChainIK3D, SplineIK3D, JacobianIK3D, IterateIK3D — дополнительные солверы для специальных случаев.

Применяется через SkeletonModifier3D-узлы, привязанные к Skeleton3D. Пример: рука персонажа тянется к ручке двери при взаимодействии.

Импорт анимации

Источники:

  • glTF 2.0 — рекомендованный формат для 3D-моделей с анимацией. Из Blender экспортируется идеально.
  • FBX — нативный импорт с 4.3 через ufbx (без внешнего FBX2glTF).
  • Mixamo анимации — лучше через glTF; FBX тоже работает с retargeting.

При импорте Godot создаёт сцену (.tscn-аналог) с Skeleton3D + AnimationPlayer + AnimationLibrary. Настройки импорта (scale factor, animation library mapping) — в Import-доке.

Для retargeting (перенести анимацию с одного скелета на другой) используйте Skeleton Profile (SkeletonProfileHumanoid встроен).

Animation Events / Method Tracks

Аналог Unity Animation Event в Godot — Method Track: трек, который вызывает метод на узле в заданный момент. В Animation editor: Add Track → Call Method Track → выбрать узел → keyframe выставляет в payload имя метода и параметры:

# Этот метод можно дёрнуть из Method Track в анимации "Walk"
func on_footstep() -> void:
    $StepSound.play()

В следующей главе — UI.