Разработка игрLua / Luau

Как сделать анимацию в Roblox Studio и запустить её по нажатию клавиши

Создаём R15-анимацию в Roblox Studio, публикуем её, загружаем через Animator и запускаем клавишей F. Готовый LocalScript, приоритеты и разбор ошибок.

Кодик

Автор

6 мин чтения

Чтобы запустить свою анимацию в Roblox Studio, создайте её на R15-риге, опубликуйте через Animation Editor, вставьте полученный asset ID в объект Animation и загрузите трек через Animator. Нажатие клавиши должно обрабатываться в LocalScript. Ниже мы свяжем действие с клавишей F через ContextActionService, загрузим трек один раз после появления персонажа и добавим повторную загрузку после respawn.

Анимация в Roblox состоит из поз на ключевых кадрах. Редактор рассчитывает промежуточные положения, а игра воспроизводит опубликованный клип как AnimationTrack. Здесь важны три разных объекта: файл движения в Animation Editor, опубликованный asset ID и трек, загруженный в конкретный Animator. Если перепутать эти уровни, код выглядит правильным, но персонаж остаётся неподвижным.

1Создаём

Ставим позы на R15-риге и проверяем движение в Animation Editor.

2Публикуем

Получаем числовой asset ID, который игра может загрузить во время запуска.

3Подключаем

LocalScript загружает трек в Animator и включает его по действию игрока.

Создаём и публикуем анимацию на R15-риге

Вставьте тестовый R15-риг и запустите Animation Editor. Поставьте первую позу на отметке 0:00, затем переместите курсор времени и задайте следующую. Для жеста достаточно 1-2 секунд и трёх поз: исходной, основной и возврата. Похожая первая и последняя позы убирают резкий скачок.

Мини-анимация приветствия
  1. Добавьте R15-риг и назовите его AnimationRig. Не используйте R6, если игровые персонажи настроены на R15.
  2. Откройте Animation Editor, создайте клип Wave и оставьте первую позу нейтральной.
  3. На 0:40 поднимите правую руку, на 0:80 слегка поверните её, а на 1:20 верните в исходное положение.
  4. Отключите зацикливание для одиночного жеста и поставьте приоритет Action.
  5. В меню редактора выберите Publish to Roblox, сохраните asset и скопируйте его числовой ID.
ПараметрДля примераЗачем проверять
Тип ригаR15Кости и суставы должны совпадать с игровым персонажем
LoopfalseПриветствие заканчивается само
PriorityActionЖест перекрывает стандартную ходьбу для задействованных суставов
Asset IDТолько число из опубликованного assetЛокальный черновик нельзя загрузить по ID в игре

Путь анимации Roblox от R15-рига и ключевых кадров до опубликованного asset ID
Редактор создаёт движение, публикация даёт asset ID, а Animator превращает его в воспроизводимый трек.

Опубликованный asset и черновик редактора не одно и то же. После Publish to Roblox откройте сведения об анимации и скопируйте ID. В коде нужна строка вида 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, "Жест")
Что вы увидите после Play
  • Клавиша F запускает жест, а повторное нажатие во время воспроизведения плавно останавливает его.
  • Третий аргумент true у BindAction создаёт кнопку на сенсорном устройстве.
  • После Reset Character обработчик остаётся, а CharacterAdded загружает трек уже в нового персонажа.

Схема запуска AnimationTrack по клавише F через ContextActionService
Нажатие вызывает действие, проверяет состояние и запускает уже загруженный 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 (создаётся во время запуска)
ContextActionService связывает действие, а не только кнопку. Название ToggleWave описывает смысл действия. Сегодня оно привязано к F, а позже к нему можно добавить кнопку геймпада или изменить сенсорную кнопку, не переписывая логику воспроизведения.

Почему анимация не запускается или её перебивает ходьба

Откройте View, Output и тестируйте через Play. Сначала проверьте LocalScript, затем Animator и только потом клип. При отказе загрузки сверяйте ID, публикацию и владельца asset.

Вставлен ID модели или страницы

В AnimationId нужен ID опубликованной анимации и префикс rbxassetid://.

LocalScript лежит в Workspace

Такой скрипт обычно не запускается как клиентский контроллер. Положите его в StarterPlayerScripts.

R6-анимация запущена на R15

Набор суставов не совпадает. Создавайте клип на том же типе рига, который использует experience.

Жест почти не виден

Ходьба или другой трек влияет на те же суставы. Установите осмысленный приоритет Action и проверьте конкурирующие треки.

Карта диагностики анимации Roblox по этапам ввода загрузки и воспроизведения
Проверка по цепочке отделяет ошибку ввода от проблемы asset, рига или приоритета.

Диагностируйте цепочку слева направо

Если обработчик печатает сообщение, но трек не играет, ввод уже исправен. Если трек создаётся, но поза не видна, проверяйте риг и приоритет. Если LoadAnimation выдаёт ошибку, возвращайтесь к публикации и доступу asset. Одна проверка должна исключать один участок цепочки.

Проверяем анимацию на компьютере, телефоне и после respawn

Нажмите Play и F, остановите жест повторным нажатием, сделайте Reset Character и повторите. В Device Emulator выберите телефон: третий аргумент true создаст сенсорную кнопку. Проверьте, не закрывает ли она прыжок, чат и другие элементы.

Финальный чек-лист перед публикацией игры
  1. Клип опубликован, а в код вставлен его asset ID с префиксом rbxassetid://.
  2. Контроллер является LocalScript и лежит в StarterPlayerScripts.
  3. Одно нажатие F даёт один запуск, удержание клавиши не создаёт новые треки.
  4. Повторное нажатие останавливает жест с коротким плавным переходом.
  5. После Reset Character управление продолжает работать.
  6. В эмуляторе телефона видна кнопка «Жест», и она не перекрывает управление.
Тестируйте опубликованную версию asset. Предпросмотр в Animation Editor подтверждает только движение рига. Игровой тест дополнительно проверяет ID, доступ, LocalScript, Animator, приоритет и ввод. Именно второй тест показывает, что механика собрана полностью.
Короткие ответы
Куда вставить скрипт анимации по клавише?

Создайте LocalScript в StarterPlayerScripts, потому что клавиатурный ввод обрабатывается на клиенте.

Что вставлять в AnimationId?

Строку вида rbxassetid://1234567890 с ID опубликованной анимации.

Почему анимацию перебивает ходьба?

Треки влияют на одни суставы, а приоритет жеста недостаточен. Для действия обычно подходит AnimationPriority.Action.

Нужно ли загружать AnimationTrack при каждом нажатии?

Нет. Загрузите трек один раз для текущего персонажа и загрузите новый после respawn.

Как добавить кнопку для телефона?

Передайте true третьим аргументом BindAction и задайте подпись через ContextActionService:SetTitle().

Превратите один жест в небольшую игровую механику

Закрепите переменные, функции и события в курсе Lua, а затем разберите первый скрипт Roblox Lua. Так вы сможете менять клавишу, скорость и условия запуска осознанно.

Для целого проекта используйте хаб по созданию первой игры в Roblox Studio. Если Output показывает красную строку, откройте разбор ошибок Roblox Studio и проверьте цепочку от ввода до Animator.