Roblox · Анимации
Пока в руках определённое оружие и персонаж стоит на месте, он держит его по-своему — твоей анимацией. Пошёл или прыгнул — обычный бег; убрал оружие — обычная стойка. У каждого оружия может быть своя.
Синим — что нужно создать.
StarterPlayer └─ StarterCharacterScripts └─ WeaponIdle (LocalScript) StarterPack ├─ Gun (Tool) — оружие со своей стойкой │ ├─ Handle (Part) │ └─ Idle (Animation) — AnimationId стойки └─ Sword (Tool) — без Idle — стойка обычная
Где: 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) и убедись: