Roblox · Хоррор · урок 3

Бег и приседание

Shift — бег, C — присесть. Скорость меняется всегда, а свои анимации бега и приседа можно добавить, если они у тебя есть.

Структура

Синим — что добавляем на этом уроке.

StarterPlayer
└─ StarterCharacterScripts — скрипты кладутся в каждого персонажа
   ├─ RunScript (LocalScript)
   │  └─ RunAnim (Animation) — AnimationId — по желанию
   └─ CrouchScript (LocalScript)
      └─ CrouchAnim (Animation) — AnimationId — по желанию

Шаги

  1. StarterPlayer → StarterCharacterScripts → LocalScript «RunScript», в него Animation «RunAnim».
  2. Там же LocalScript «CrouchScript» с Animation «CrouchAnim».
  3. Свои анимации: Avatar → Animation Editor, сохрани (Publish to Roblox) и вставь ID в AnimationId. Анимация должна принадлежать тебе или группе игры — чужие ID в твоей игре не проиграются.
  4. Нет своих анимаций — оставь AnimationId пустым: бег всё равно ускоряет (стандартная анимация бега включится сама), а присед опускает камеру и замедляет.
  5. StarterPlayer → EnableMouseLockOption выкл. — иначе Shift включает «шифт-лок» вместо бега.
  6. Скрипты общаются через атрибут Crouching у персонажа: сидя бег не включается, а присев на бегу, игрок замедляется.

Скрипты

RunScript

Где: StarterPlayer → StarterCharacterScripts · LocalScript
Зачем: Бег на Shift.

-- клавиатура
local UIS = game:GetService("UserInputService")
-- скрипт лежит в персонаже
local character = script.Parent
-- Humanoid
local humanoid = character:WaitForChild("Humanoid")
-- проигрывает анимации
local animator = humanoid:WaitForChild("Animator")
-- скорость бега
local RUN_SPEED = 25
-- обычная скорость
local WALK_SPEED = 16

-- Animation внутри скрипта
local runAnim = script:WaitForChild("RunAnim")
-- дорожка анимации (если есть своя)
local runTrack = nil
-- ID вставлен
if runAnim.AnimationId ~= "" then
    -- загружаем
    runTrack = animator:LoadAnimation(runAnim)
    -- важнее обычной ходьбы
    runTrack.Priority = Enum.AnimationPriority.Movement
    -- по кругу
    runTrack.Looped = true
-- конец проверки
end
-- сейчас бежим?
local running = false

-- включает и выключает анимацию бега
local function UpdateAnim()
    -- своей анимации нет — бежим стандартной
    if not runTrack then return end
    -- персонаж двигается
    local moving = humanoid.MoveDirection.Magnitude > 0
    -- бежим, а анимация не играет
    if running and moving and not runTrack.IsPlaying then
        -- включаем плавно
        runTrack:Play(0.2)
    -- остановились
    elseif (not running or not moving) and runTrack.IsPlaying then
        -- выключаем
        runTrack:Stop(0.2)
    -- конец проверки
    end
-- конец функции
end

-- начать или закончить бег
local function SetRunning(value)
    -- погибшие не бегают
    if humanoid.Health <= 0 then return end
    -- сидим? (ставит скрипт приседания)
    local crouching = character:GetAttribute("Crouching")
    -- сидя не бегаем
    running = value and not crouching
    -- скоростью сидя управляет другой скрипт
    if not crouching then
        -- бег или шаг
        humanoid.WalkSpeed = running and RUN_SPEED or WALK_SPEED
    -- конец проверки
    end
    -- анимация
    UpdateAnim()
-- конец функции
end

-- нажали клавишу
UIS.InputBegan:Connect(function(input, processed)
    -- левый Shift, и не в чате
    if not processed and input.KeyCode == Enum.KeyCode.LeftShift then
        -- бежим
        SetRunning(true)
    -- конец проверки
    end
-- конец функции
end)
-- отпустили клавишу
UIS.InputEnded:Connect(function(input)
    -- это Shift
    if input.KeyCode == Enum.KeyCode.LeftShift then
        -- идём шагом
        SetRunning(false)
    -- конец проверки
    end
-- конец функции
end)
-- встали или пошли — обновляем анимацию
humanoid:GetPropertyChangedSignal("MoveDirection"):Connect(UpdateAnim)
-- присели во время бега
character:GetAttributeChangedSignal("Crouching"):Connect(function()
    -- бег прекращается
    if character:GetAttribute("Crouching") then SetRunning(false) end
-- конец функции
end)

CrouchScript

Где: StarterPlayer → StarterCharacterScripts · LocalScript
Зачем: Присед на C.

-- клавиатура
local UIS = game:GetService("UserInputService")
-- персонаж
local character = script.Parent
-- Humanoid
local humanoid = character:WaitForChild("Humanoid")
-- анимации
local animator = humanoid:WaitForChild("Animator")
-- скорость сидя
local CROUCH_SPEED = 6
-- обычная скорость
local WALK_SPEED = 16

-- Animation внутри скрипта
local crouchAnim = script:WaitForChild("CrouchAnim")
-- дорожка анимации
local track = nil
-- своя анимация есть
if crouchAnim.AnimationId ~= "" then
    -- загружаем
    track = animator:LoadAnimation(crouchAnim)
    -- поверх ходьбы и стояния
    track.Priority = Enum.AnimationPriority.Action
    -- по кругу
    track.Looped = true
-- конец проверки
end
-- сидим?
local crouching = false

-- нажали клавишу
UIS.InputBegan:Connect(function(input, processed)
    -- нужна C и не в чате
    if processed or input.KeyCode ~= Enum.KeyCode.C then return end
    -- погибшие не приседают
    if humanoid.Health <= 0 then return end
    -- C переключает: сесть / встать
    crouching = not crouching
    -- сообщаем скрипту бега
    character:SetAttribute("Crouching", crouching)
    -- сели
    if crouching then
        -- медленно
        humanoid.WalkSpeed = CROUCH_SPEED
        -- камера ниже — видно и без анимации
        humanoid.CameraOffset = Vector3.new(0, -1.5, 0)
        -- анимация приседа
        if track then track:Play(0.2) end
    -- встали
    else
        -- обычная скорость
        humanoid.WalkSpeed = WALK_SPEED
        -- камера на место
        humanoid.CameraOffset = Vector3.zero
        -- выключаем анимацию
        if track then track:Stop(0.2) end
    -- конец проверки
    end
-- конец функции
end)

Проверка

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