Бег с выносливостью: Shift и отдых
Бег расходует запас сил, а ходьба постепенно восстанавливает его.
Персонаж ускоряется на Shift до истощения запаса сил.
1. Подготовьте объект
Где разместить: Отдельные блоки кода: создайте файлы в указанных местах
В StarterPlayer → StarterPlayerScripts добавьте LocalScript StaminaClient и вставьте код.
В Play удерживайте левый Shift во время движения: персонаж бежит быстрее, расходуя выносливость. После отдыха запас сил восстанавливается.
В отличие от предыдущего примера скрипт меняет WalkSpeed при начале и окончании бега, а не каждый кадр. Он не должен принудительно сбрасывать ускорение, выданное другой механикой. Это клиентский учебный пример; для соревновательной игры проверяйте скорость на сервере.
2. Вставьте код
-- 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, прыжок или освещение, могут влиять друг на друга.
Сделайте RUN_SPEED равной 30.
Увеличьте скорость восстановления RECOVER.
Придумайте трассу, где нужно экономно расходовать силы.
4. Проверьте себя
Почему нельзя бежать ускоренно бесконечно?
Убедитесь, что используете LocalScript именно в StarterPlayerScripts и запускаете Play. На телефоне Shift отсутствует: используйте отдельный урок с ContextActionService. Если другие скрипты постоянно меняют WalkSpeed, настройте единый контроллер скорости.