Roblox · Анимации

Свой бег с оружием

С определённым оружием в руках персонаж бегает по-своему: с винтовкой у груди, с мечом у бедра. Убрал оружие — обычный бег. Вместе со стойкой и перезарядкой из раздела «Оружие» получается полный набор.

Структура

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

StarterPlayer
└─ StarterCharacterScripts
   ├─ WeaponRun (LocalScript)
   └─ WeaponIdle (LocalScript) — стойка — со страницы «Своя стойка с оружием»
StarterPack
└─ Rifle (Tool)
   ├─ Handle (Part)
   ├─ Run (Animation) — бег с этим оружием
   ├─ Idle (Animation) — стойка — по желанию
   └─ GunLocal (LocalScript) — перезарядка — как в разделе «Оружие»

Шаги

  1. Сделать анимацию: Avatar → Rig Builder → R15 (или R6 — как у персонажей в игре: Game Settings → Avatar). Выдели риг → Avatar → Animation Editor → имя анимации → Create.
  2. Скопируй Tool внутрь рига и анимируй бег с оружием в руках: ноги бегут, руки держат оружие. Цикл: первый и последний кадры одинаковые, Loop — вкл. «⋯» → Set Animation Priority → Movement.
  3. Готово — «⋯» → Publish to Roblox → Submit → скопируй ID. Публикуй с того же аккаунта (или группы), что и игру: чужая анимация в твоей игре не проиграется.
  4. В Tool «+» → Animation, имя — точно «Run», в AnimationId — ID бега.
  5. StarterPlayer → StarterCharacterScripts → «+» → LocalScript «WeaponRun» — один на все оружия.
  6. Как работает: взял оружие с Run — скрипт запоминает обычные ID бега и ходьбы в стандартном Animate и ставит вместо них бег оружия. Animate сам подстраивает скорость анимации под скорость персонажа. Убрал оружие — ID возвращаются. Другие игроки тоже видят твой бег: анимации своего персонажа Roblox показывает всем.
  7. Если уже бежал в момент, когда взял оружие, новая анимация включится со следующего старта бега.
  8. WeaponIdle и WeaponRun работают вместе: стоишь — стойка, бежишь — бег с оружием; перезарядка оружия (раздел «Оружие») играет поверх.

Скрипты

WeaponRun

Где: StarterPlayer → StarterCharacterScripts · LocalScript
Зачем: Пока в руках оружие с Run, персонаж бегает и ходит этой анимацией.

-- персонаж (скрипт кладётся в него)
local character = script.Parent
-- стандартный скрипт анимаций
local animate = character:WaitForChild("Animate")

-- обычные ID бега и ходьбы — вернём, когда уберём оружие
local saved = {}
-- оружие, чей бег сейчас включён
local runTool = nil

-- анимация run или walk внутри Animate
local function Anim(name)
    -- папка с этим именем
    local folder = animate:FindFirstChild(name)
    -- анимация в ней или nil
    return folder and folder:FindFirstChildOfClass("Animation")
-- конец функции
end

-- вернуть обычный бег
local function Restore()
    -- каждый запомненный ID
    for name, id in pairs(saved) do
        -- его анимация
        local anim = Anim(name)
        -- возвращаем как было
        if anim then anim.AnimationId = id end
    -- конец перебора
    end
    -- больше ничего не помним
    saved = {}
    -- бега с оружием нет
    runTool = nil
-- конец функции
end

-- в персонаже что-то появилось
character.ChildAdded:Connect(function(child)
    -- это не оружие
    if not child:IsA("Tool") then return end
    -- у этого оружия свой бег?
    local run = child:FindFirstChild("Run")
    -- нет — бег обычный
    if not run or not run:IsA("Animation") then return end
    -- сначала возвращаем обычный (вдруг было другое оружие)
    Restore()
    -- бег и ходьба
    for _, name in ipairs({"run", "walk"}) do
        -- анимация в Animate
        local anim = Anim(name)
        -- есть
        if anim then
            -- запоминаем обычную
            saved[name] = anim.AnimationId
            -- ставим бег оружия
            anim.AnimationId = run.AnimationId
        -- конец проверки
        end
    -- конец перебора
    end
    -- запоминаем оружие
    runTool = child
-- конец обработчика
end)

-- из персонажа что-то убрали
character.ChildRemoved:Connect(function(child)
    -- убрали это оружие — обычный бег
    if child == runTool then Restore() end
-- конец обработчика
end)

Проверка

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