Анимация — 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 Animation Window — то же ощущение записи треков по timeline’у. Но Unity Animator Controller — отдельный state-machine ассет. В Godot его аналог — AnimationTree, и он привязан к одному AnimationPlayer.
Запись анимации в редакторе
- Выберите AnimationPlayer в сцене → внизу появится Animation editor.
- Кнопка “Animation” → New → имя.
- Включите красную точку (Recording) → измените любое свойство в Inspector → keyframe создастся автоматически в текущей точке таймлайна.
- Прокрутите таймлайн → измените снова → второй 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-параметрический блендинг (например,
speed0..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 и пройдёт.
AnimationTree предоставляет все настраиваемые параметры графа через subscript-нотацию по строке.
anim_tree["parameters/Locomotion/blend_position"] — путь в графе. Хеширование путей при
частом доступе можно делать через var path = "parameters/...": константу.
Root Motion
Если в анимации скелет двигается (“шаг вперёд”) — по умолчанию AnimationPlayer не двигает GameObject. Только меняет позы. Для перевода смещения скелета в реальное движение узла:
- На AnimationTree укажите
root_motion_track— путь к корневой кости (Skeleton3D:Hips). - В скрипте читайте
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.