Roblox · Интерфейсы
Внизу слева — полоса здоровья с числами и полоса выносливости. Shift — бег, выносливость тратится; закончилась — бежать нельзя, пока не восстановится.
Синим — что нужно создать.
StarterGui └─ HudGui (ScreenGui) — ResetOnSpawn выкл. ├─ Health (Frame) — тёмная подложка │ ├─ Bar (Frame) — зелёная полоса │ └─ Value (TextLabel) — числа, ZIndex 2 ├─ Stamina (Frame) — тёмная подложка │ └─ Bar (Frame) — голубая полоса └─ HudLocal (LocalScript) Workspace └─ DamagePart (Part) — плита для проверки урона └─ HurtScript (Script)
Где: StarterGui → HudGui · LocalScript
Зачем: Полоски, бег и выносливость.
-- игроки
local Players = game:GetService("Players")
-- клавиатура
local UIS = game:GetService("UserInputService")
-- каждый кадр
local RunService = game:GetService("RunService")
-- стандартный интерфейс Roblox
local StarterGui = game:GetService("StarterGui")
-- этот игрок
local player = Players.LocalPlayer
-- HudGui
local gui = script.Parent
-- полоса здоровья
local healthBar = gui:WaitForChild("Health"):WaitForChild("Bar")
-- «80 / 100»
local healthText = gui.Health:WaitForChild("Value")
-- полоса выносливости
local staminaBar = gui:WaitForChild("Stamina"):WaitForChild("Bar")
-- запас выносливости
local MAX_STAMINA = 100
-- тратится в секунду при беге
local DRAIN = 25
-- восстанавливается в секунду
local REGEN = 15
-- скорость бега
local RUN_SPEED = 24
-- обычная скорость
local WALK_SPEED = 16
-- сейчас
local stamina = MAX_STAMINA
-- Shift зажат
local shiftDown = false
-- бежим ли сейчас
local isRunning = false
-- Humanoid текущего персонажа
local humanoid = nil
-- прячем стандартную полоску Roblox
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Health, false)
-- появился персонаж
local function OnCharacter(character)
-- его Humanoid
humanoid = character:WaitForChild("Humanoid")
-- выносливость полная
stamina = MAX_STAMINA
-- не бежим
isRunning = false
-- обновить здоровье
local function UpdateHealth()
-- доля здоровья
local k = math.clamp(humanoid.Health / humanoid.MaxHealth, 0, 1)
-- длина полосы
healthBar.Size = UDim2.fromScale(k, 1)
-- числа
healthText.Text = math.ceil(humanoid.Health) .. " / " .. math.ceil(humanoid.MaxHealth)
-- конец функции
end
-- урон или лечение
humanoid.HealthChanged:Connect(UpdateHealth)
-- сменился максимум (броня)
humanoid:GetPropertyChangedSignal("MaxHealth"):Connect(UpdateHealth)
-- сразу
UpdateHealth()
-- конец функции
end
-- каждое появление
player.CharacterAdded:Connect(OnCharacter)
-- персонаж уже есть
if player.Character then task.spawn(OnCharacter, player.Character) end
-- нажали клавишу
UIS.InputBegan:Connect(function(input, processed)
-- Shift — бег
if not processed and input.KeyCode == Enum.KeyCode.LeftShift then shiftDown = true end
-- конец функции
end)
-- отпустили
UIS.InputEnded:Connect(function(input)
-- Shift отпущен
if input.KeyCode == Enum.KeyCode.LeftShift then shiftDown = false end
-- конец функции
end)
-- каждый кадр; dt — секунды с прошлого кадра
RunService.Heartbeat:Connect(function(dt)
-- нет персонажа или погиб
if not humanoid or humanoid.Health <= 0 then return end
-- идём
local moving = humanoid.MoveDirection.Magnitude > 0
-- можно бежать
local want = shiftDown and moving and stamina > 0
-- бежим
if want then
-- тратим
stamina = math.max(stamina - DRAIN * dt, 0)
-- Shift отпущен или стоим
elseif not (shiftDown and moving) then
-- восстанавливаем
stamina = math.min(stamina + REGEN * dt, MAX_STAMINA)
-- конец проверки
end
-- состояние сменилось
if want ~= isRunning then
-- запоминаем
isRunning = want
-- скорость меняем только в этот момент
humanoid.WalkSpeed = want and RUN_SPEED or WALK_SPEED
-- конец проверки
end
-- длина полосы выносливости
staminaBar.Size = UDim2.fromScale(stamina / MAX_STAMINA, 1)
-- конец функции
end)Где: Workspace → DamagePart · Script
Зачем: Плита для проверки урона.
-- плита, которая жжётся
local part = script.Parent
-- урон за касание
local DAMAGE = 10
-- не чаще раза в секунду
local COOLDOWN = 1
-- Humanoid → время последнего урона
local last = {}
-- касание
part.Touched:Connect(function(hit)
-- это персонаж?
local humanoid = hit.Parent:FindFirstChildOfClass("Humanoid")
-- нет
if not humanoid then return end
-- недавно уже било
if os.clock() - (last[humanoid] or 0) < COOLDOWN then return end
-- запоминаем
last[humanoid] = os.clock()
-- урон
humanoid:TakeDamage(DAMAGE)
-- конец функции
end)Запусти Play (или Run) и убедись: