Чтобы запустить свою анимацию в Roblox Studio, создайте её на R15-риге, опубликуйте через Animation Editor, вставьте полученный asset ID в объект Animation и загрузите трек через Animator. Нажатие клавиши должно обрабатываться в LocalScript. Ниже мы свяжем действие с клавишей F через ContextActionService, загрузим трек один раз после появления персонажа и добавим повторную загрузку после respawn.
Анимация в Roblox состоит из поз на ключевых кадрах. Редактор рассчитывает промежуточные положения, а игра воспроизводит опубликованный клип как AnimationTrack. Здесь важны три разных объекта: файл движения в Animation Editor, опубликованный asset ID и трек, загруженный в конкретный Animator. Если перепутать эти уровни, код выглядит правильным, но персонаж остаётся неподвижным.
Ставим позы на R15-риге и проверяем движение в Animation Editor.
Получаем числовой asset ID, который игра может загрузить во время запуска.
LocalScript загружает трек в Animator и включает его по действию игрока.
Создаём и публикуем анимацию на R15-риге
Вставьте тестовый R15-риг и запустите Animation Editor. Поставьте первую позу на отметке 0:00, затем переместите курсор времени и задайте следующую. Для жеста достаточно 1-2 секунд и трёх поз: исходной, основной и возврата. Похожая первая и последняя позы убирают резкий скачок.
- Добавьте R15-риг и назовите его
AnimationRig. Не используйте R6, если игровые персонажи настроены на R15. - Откройте Animation Editor, создайте клип
Waveи оставьте первую позу нейтральной. - На 0:40 поднимите правую руку, на 0:80 слегка поверните её, а на 1:20 верните в исходное положение.
- Отключите зацикливание для одиночного жеста и поставьте приоритет Action.
- В меню редактора выберите Publish to Roblox, сохраните asset и скопируйте его числовой ID.
| Параметр | Для примера | Зачем проверять |
|---|---|---|
| Тип рига | R15 | Кости и суставы должны совпадать с игровым персонажем |
| Loop | false | Приветствие заканчивается само |
| Priority | Action | Жест перекрывает стандартную ходьбу для задействованных суставов |
| Asset ID | Только число из опубликованного asset | Локальный черновик нельзя загрузить по ID в игре |

Редактор создаёт движение, публикация даёт asset ID, а Animator превращает его в воспроизводимый трек.
rbxassetid://1234567890. Если изменить движение позже, опубликуйте новую версию и снова протестируйте игру.Запускаем анимацию по клавише F
Создайте LocalScript в StarterPlayer > StarterPlayerScripts: клавиатурный ввод относится к локальному игроку. Код заранее создаёт Animation, получает Humanoid и Animator, а после respawn заменяет старый трек новым.
local Players = game:GetService("Players")
local ContextActionService = game:GetService("ContextActionService")
local player = Players.LocalPlayer
local ACTION_NAME = "ToggleWave"
local ANIMATION_ID = "rbxassetid://1234567890"
local animation = Instance.new("Animation")
animation.AnimationId = ANIMATION_ID
local currentTrack = nil
local function loadAnimation(character)
local humanoid = character:WaitForChild("Humanoid")
local animator = humanoid:WaitForChild("Animator")
currentTrack = animator:LoadAnimation(animation)
currentTrack.Priority = Enum.AnimationPriority.Action
currentTrack.Looped = false
end
local function handleAction(_actionName, inputState, _inputObject)
if inputState ~= Enum.UserInputState.Begin or not currentTrack then
return Enum.ContextActionResult.Pass
end
if currentTrack.IsPlaying then
currentTrack:Stop(0.15)
else
currentTrack:Play(0.15)
end
return Enum.ContextActionResult.Sink
end
if player.Character then
loadAnimation(player.Character)
end
player.CharacterAdded:Connect(loadAnimation)
ContextActionService:BindAction(
ACTION_NAME,
handleAction,
true,
Enum.KeyCode.F
)
ContextActionService:SetTitle(ACTION_NAME, "Жест")- Клавиша F запускает жест, а повторное нажатие во время воспроизведения плавно останавливает его.
- Третий аргумент
trueуBindActionсоздаёт кнопку на сенсорном устройстве. - После Reset Character обработчик остаётся, а
CharacterAddedзагружает трек уже в нового персонажа.

Нажатие вызывает действие, проверяет состояние и запускает уже загруженный AnimationTrack.
Как устроены Animator, AnimationTrack и обработчик действия
Animation хранит ссылку на клип. Animator:LoadAnimation() превращает её в AnimationTrack, который можно запускать и останавливать. Не загружайте трек при каждом нажатии: создайте его один раз для текущего персонажа и замените после respawn.
| Строка | Что делает | Частая ошибка |
|---|---|---|
WaitForChild("Animator") | Ждёт готовый Animator внутри Humanoid | Искать Animator прямо в Player |
LoadAnimation(animation) | Создаёт трек для конкретного персонажа | Вызывать заново при каждом нажатии |
Priority = Action | Поднимает жест над стандартными движениями | Оставлять слишком низкий приоритет |
InputState.Begin | Срабатывает один раз в момент нажатия | Реагировать на Begin, Change и End |
StarterPlayer
└── StarterPlayerScripts
└── WaveController (LocalScript)
Player.Character
└── Humanoid
└── Animator
└── AnimationTrack (создаётся во время запуска)ToggleWave описывает смысл действия. Сегодня оно привязано к F, а позже к нему можно добавить кнопку геймпада или изменить сенсорную кнопку, не переписывая логику воспроизведения.Почему анимация не запускается или её перебивает ходьба
Откройте View, Output и тестируйте через Play. Сначала проверьте LocalScript, затем Animator и только потом клип. При отказе загрузки сверяйте ID, публикацию и владельца asset.
В AnimationId нужен ID опубликованной анимации и префикс rbxassetid://.
Такой скрипт обычно не запускается как клиентский контроллер. Положите его в StarterPlayerScripts.
Набор суставов не совпадает. Создавайте клип на том же типе рига, который использует experience.
Ходьба или другой трек влияет на те же суставы. Установите осмысленный приоритет Action и проверьте конкурирующие треки.

Проверка по цепочке отделяет ошибку ввода от проблемы asset, рига или приоритета.
Если обработчик печатает сообщение, но трек не играет, ввод уже исправен. Если трек создаётся, но поза не видна, проверяйте риг и приоритет. Если LoadAnimation выдаёт ошибку, возвращайтесь к публикации и доступу asset. Одна проверка должна исключать один участок цепочки.
Проверяем анимацию на компьютере, телефоне и после respawn
Нажмите Play и F, остановите жест повторным нажатием, сделайте Reset Character и повторите. В Device Emulator выберите телефон: третий аргумент true создаст сенсорную кнопку. Проверьте, не закрывает ли она прыжок, чат и другие элементы.
- Клип опубликован, а в код вставлен его asset ID с префиксом
rbxassetid://. - Контроллер является LocalScript и лежит в StarterPlayerScripts.
- Одно нажатие F даёт один запуск, удержание клавиши не создаёт новые треки.
- Повторное нажатие останавливает жест с коротким плавным переходом.
- После Reset Character управление продолжает работать.
- В эмуляторе телефона видна кнопка «Жест», и она не перекрывает управление.
Куда вставить скрипт анимации по клавише?
Создайте LocalScript в StarterPlayerScripts, потому что клавиатурный ввод обрабатывается на клиенте.
Что вставлять в AnimationId?
Строку вида rbxassetid://1234567890 с ID опубликованной анимации.
Почему анимацию перебивает ходьба?
Треки влияют на одни суставы, а приоритет жеста недостаточен. Для действия обычно подходит AnimationPriority.Action.
Нужно ли загружать AnimationTrack при каждом нажатии?
Нет. Загрузите трек один раз для текущего персонажа и загрузите новый после respawn.
Как добавить кнопку для телефона?
Передайте true третьим аргументом BindAction и задайте подпись через ContextActionService:SetTitle().
Закрепите переменные, функции и события в курсе Lua, а затем разберите первый скрипт Roblox Lua. Так вы сможете менять клавишу, скорость и условия запуска осознанно.
Для целого проекта используйте хаб по созданию первой игры в Roblox Studio. Если Output показывает красную строку, откройте разбор ошибок Roblox Studio и проверьте цепочку от ввода до Animator.