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)

Шаги

  1. StarterGui → ScreenGui «HudGui», ResetOnSpawn выкл.
  2. Frame «Health» (Size {0.22,0},{0.03,0}, Position {0.02,0},{0.86,0}, тёмный) → внутри Frame «Bar» (Size {1,0},{1,0}, зелёный) и TextLabel «Value» (во весь Health, ZIndex 2). Скругление — UICorner в обоих.
  3. Так же Frame «Stamina» чуть ниже (Position {0.02,0},{0.9,0}) с голубым «Bar».
  4. LocalScript «HudLocal» в HudGui. Стандартная полоска Roblox справа вверху прячется — SetCoreGuiEnabled.
  5. Скорость меняется только в момент начала и конца бега — другие скрипты (энергетик, замедление) её не потеряют.
  6. Для проверки урона — красная плита «DamagePart» со скриптом «HurtScript»: −10 раз в секунду.

Скрипты

HudLocal

Где: 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)

HurtScript

Где: 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) и убедись:

Собрать полоски одной командой