← Все практические скрипты
Персонаж · Уверенный · 30 мин

Бег с выносливостью: Shift и отдых

Бег расходует запас сил, а ходьба постепенно восстанавливает его.

Иллюстрация: Бег с выносливостью: Shift и отдых
🎯 Что получится

Персонаж ускоряется на Shift до истощения запаса сил.

1. Подготовьте объект

Где разместить: Отдельные блоки кода: создайте файлы в указанных местах

В StarterPlayer → StarterPlayerScripts добавьте LocalScript StaminaClient и вставьте код.
В Play удерживайте левый Shift во время движения: персонаж бежит быстрее, расходуя выносливость. После отдыха запас сил восстанавливается.
В отличие от предыдущего примера скрипт меняет WalkSpeed при начале и окончании бега, а не каждый кадр. Он не должен принудительно сбрасывать ускорение, выданное другой механикой. Это клиентский учебный пример; для соревновательной игры проверяйте скорость на сервере.

2. Вставьте код

Script / LocalScript
-- FILE: StarterPlayer/StarterPlayerScripts/StaminaClient (LocalScript)
-- Бег с выносливостью; не сбрасываем скорость каждый кадр.
local Players = game:GetService("Players")
local UIS = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local player = Players.LocalPlayer
local RUN_SPEED = 26
local MAX_STAMINA, DRAIN, RECOVER = 100, 25, 18
local stamina, holding, sprinting, exhausted = MAX_STAMINA, false, false, false
local humanoid, originalSpeed

local function stopSprint()
    if not sprinting then return end
    sprinting = false
    if humanoid and humanoid.Parent and originalSpeed and math.abs(humanoid.WalkSpeed - RUN_SPEED) < 0.01 then
        humanoid.WalkSpeed = originalSpeed
    end
    originalSpeed = nil
end
local function setup(character)
    stopSprint()
    humanoid = character:WaitForChild("Humanoid")
    stamina, holding, sprinting, exhausted = MAX_STAMINA, false, false, false
    originalSpeed = nil
end
player.CharacterAdded:Connect(setup)
if player.Character then setup(player.Character) end
UIS.InputBegan:Connect(function(input, processed)
    if not processed and input.KeyCode == Enum.KeyCode.LeftShift then holding = true end
end)
UIS.InputEnded:Connect(function(input)
    if input.KeyCode == Enum.KeyCode.LeftShift then holding = false end
end)
RunService.Heartbeat:Connect(function(dt)
    if not humanoid or humanoid.Health <= 0 then return end
    local moving = humanoid.MoveDirection.Magnitude > 0.1
    if exhausted and stamina >= 30 then exhausted = false end
    local wantSprint = holding and moving and not exhausted and stamina > 0
    if wantSprint and not sprinting then
        originalSpeed = humanoid.WalkSpeed
        humanoid.WalkSpeed = RUN_SPEED
        sprinting = true
    elseif not wantSprint and sprinting then
        stopSprint()
    end
    if sprinting then
        stamina = math.max(0, stamina - DRAIN * dt)
        if stamina <= 0 then
            exhausted = true
            stopSprint()
        end
    else
        stamina = math.min(MAX_STAMINA, stamina + RECOVER * dt)
    end
end)

3. Проверьте в игре

Нажмите Play в Roblox Studio и проверьте действие механики. Если механика не работает, откройте окно Output и проверьте тип скрипта, его расположение и названия объектов.

Ваш прогресс

Когда проверите механику в Roblox Studio, отметьте практику как выполненную. Отметка хранится только в этом браузере, не в личном кабинете.

Если объединяете несколько скриптов

Добавляйте механики по одной и проверяйте окно Output. Не создавайте несколько одинаковых систем монет или интерфейсов; скрипты, меняющие WalkSpeed, прыжок или освещение, могут влиять друг на друга.

⭐ Три шага к собственной игре
1. Повторите и измените

Сделайте RUN_SPEED равной 30.

2. Улучшите

Увеличьте скорость восстановления RECOVER.

3. Придумайте своё

Придумайте трассу, где нужно экономно расходовать силы.

4. Проверьте себя

Почему нельзя бежать ускоренно бесконечно?

🛠 Если не работает

Убедитесь, что используете LocalScript именно в StarterPlayerScripts и запускаете Play. На телефоне Shift отсутствует: используйте отдельный урок с ContextActionService. Если другие скрипты постоянно меняют WalkSpeed, настройте единый контроллер скорости.