Roblox · Анимации

Своя стойка с оружием

Пока в руках определённое оружие и персонаж стоит на месте, он держит его по-своему — твоей анимацией. Пошёл или прыгнул — обычный бег; убрал оружие — обычная стойка. У каждого оружия может быть своя.

Структура

Синим — что нужно создать.

StarterPlayer
└─ StarterCharacterScripts
   └─ WeaponIdle (LocalScript)
StarterPack
├─ Gun (Tool) — оружие со своей стойкой
│  ├─ Handle (Part)
│  └─ Idle (Animation) — AnimationId стойки
└─ Sword (Tool) — без Idle — стойка обычная

Шаги

  1. Сделать анимацию: Avatar → Rig Builder → R15 (или R6 — как у персонажей в игре: Game Settings → Avatar). Выдели риг → Avatar → Animation Editor → имя анимации → Create.
  2. Чтобы видеть, как лежит оружие: скопируй Tool внутрь рига (как персонаж его держит) и анимируй позу целиком — руки, корпус, голову.
  3. Стойка — тоже цикл: лёгкое дыхание или покачивание, первый и последний кадры одинаковые. Включи Loop.
  4. Готово — «⋯» → Publish to Roblox → Submit → скопируй ID. Публикуй с того же аккаунта (или группы), что и игру: чужая анимация в твоей игре не проиграется.
  5. В Tool «+» → Animation, имя — точно «Idle», в AnimationId — ID стойки.
  6. StarterPlayer → StarterCharacterScripts → «+» → LocalScript «WeaponIdle». Скрипт один на все оружия: стойку берёт из Idle того оружия, что сейчас в руках.
  7. Как работает: взял Tool с Idle — скрипт загружает его стойку. Каждый кадр проверяет: стоит ли персонаж (не жмёт WASD и не в воздухе). Стоит — играет стойка, двинулся — стойка плавно гаснет и работает обычный бег.
  8. Приоритет стойки скрипт ставит Action — она главнее стандартной стойки и хвата оружия.

Скрипты

WeaponIdle

Где: StarterPlayer → StarterCharacterScripts · LocalScript
Зачем: Включает стойку оружия из его Idle, пока персонаж стоит.

-- персонаж (скрипт кладётся в него)
local character = script.Parent
-- его Humanoid
local humanoid = character:WaitForChild("Humanoid")
-- проигрывает анимации
local animator = humanoid:WaitForChild("Animator")
-- события каждого кадра
local RunService = game:GetService("RunService")

-- стойка оружия, которое сейчас в руках
local track = nil
-- чьё это оружие
local trackTool = nil

-- убрать стойку
local function Stop()
    -- стойка есть
    if track then
        -- плавно останавливаем за 0,2 с
        track:Stop(0.2)
        -- освобождаем
        track:Destroy()
    -- конец проверки
    end
    -- стойки нет
    track = nil
    -- и оружия тоже
    trackTool = nil
-- конец функции
end

-- в персонаже что-то появилось
character.ChildAdded:Connect(function(child)
    -- это не оружие
    if not child:IsA("Tool") then return end
    -- у этого оружия есть своя стойка?
    local anim = child:FindFirstChild("Idle")
    -- нет — обычная стойка
    if not anim or not anim:IsA("Animation") then return end
    -- старую стойку убираем
    Stop()
    -- загружаем стойку оружия
    track = animator:LoadAnimation(anim)
    -- важнее обычной стойки и хвата оружия
    track.Priority = Enum.AnimationPriority.Action
    -- повторяется, пока стоим
    track.Looped = true
    -- запоминаем, чья стойка
    trackTool = child
-- конец обработчика
end)

-- из персонажа что-то убрали
character.ChildRemoved:Connect(function(child)
    -- убрали именно это оружие
    if child == trackTool then
        -- стойка больше не нужна
        Stop()
    -- конец проверки
    end
-- конец обработчика
end)

-- каждый кадр
RunService.RenderStepped:Connect(function()
    -- оружия со стойкой в руках нет
    if not track then return end
    -- игрок жмёт WASD
    local moving = humanoid.MoveDirection.Magnitude > 0.1
    -- в прыжке или падает
    local inAir = humanoid.FloorMaterial == Enum.Material.Air
    -- стоит на месте
    local standing = not moving and not inAir
    -- встал — стойки ещё нет
    if standing and not track.IsPlaying then
        -- плавно включаем свою стойку
        track:Play(0.2)
    -- пошёл или прыгнул
    elseif not standing and track.IsPlaying then
        -- убираем — играет обычный бег
        track:Stop(0.2)
    -- конец проверки
    end
-- конец обработчика
end)

Проверка

Запусти Play (или Run) и убедись: