Roblox · Интерфейсы

Красная вспышка при уроне

Получил урон — края экрана вспыхивают красным и плавно гаснут. Чем сильнее удар, тем ярче вспышка.

Структура

Синим — что нужно создать.

StarterGui
└─ DamageFlashGui (ScreenGui) — ResetOnSpawn выкл., IgnoreGuiInset вкл.
   ├─ Vignette (CanvasGroup) — на весь экран, фон прозрачный
   │  └─ Edge1–Edge4 (Frame) — красные края с UIGradient
   └─ DamageFlashLocal (LocalScript)
Workspace
└─ DamagePart (Part) — плита для проверки
   └─ HurtScript (Script)

Шаги

  1. StarterGui → ScreenGui «DamageFlashGui»: ResetOnSpawn выкл., IgnoreGuiInset вкл. (на весь экран, включая верхнюю полосу).
  2. Внутри CanvasGroup «Vignette» на весь экран, BackgroundTransparency 1. CanvasGroup меняет прозрачность всего содержимого одним свойством — GroupTransparency.
  3. В Vignette — 4 красных Frame по краям: слева и справа {0.25,0},{1,0}, сверху и снизу {1,0},{0.25,0}.
  4. В каждый край — UIGradient: Transparency от 0.1 (у края) до 1 (к центру). Rotation: левый 0, правый 180, верхний 90, нижний −90 — чтобы яркая сторона была у края экрана.
  5. LocalScript «DamageFlashLocal»: потеря здоровья → GroupTransparency сразу меньше, потом твин до 1.
  6. Проверка — плита «DamagePart» со скриптом «HurtScript».

Скрипты

DamageFlashLocal

Где: StarterGui → DamageFlashGui · LocalScript
Зачем: Вспышка при потере здоровья.

-- игроки
local Players = game:GetService("Players")
-- плавное затухание
local TweenService = game:GetService("TweenService")
-- этот игрок
local player = Players.LocalPlayer
-- красные края экрана (CanvasGroup)
local vignette = script.Parent:WaitForChild("Vignette")
-- гаснет за 0.6 секунды
local FADE = TweenInfo.new(0.6, Enum.EasingStyle.Quad, Enum.EasingDirection.Out)
-- сначала не видно
vignette.GroupTransparency = 1

-- появился персонаж
local function OnCharacter(character)
    -- его Humanoid
    local humanoid = character:WaitForChild("Humanoid")
    -- здоровье до изменения
    local last = humanoid.Health
    -- здоровье изменилось
    humanoid.HealthChanged:Connect(function(health)
        -- сколько потеряли
        local lost = last - health
        -- запоминаем
        last = health
        -- это лечение
        if lost <= 0 then return end
        -- сильнее удар — ярче вспышка
        local strength = math.clamp(lost / humanoid.MaxHealth * 4, 0.3, 1)
        -- вспыхиваем
        vignette.GroupTransparency = 1 - strength
        -- и плавно гаснем
        TweenService:Create(vignette, FADE, {GroupTransparency = 1}):Play()
    -- конец функции
    end)
-- конец функции
end
-- каждое появление
player.CharacterAdded:Connect(OnCharacter)
-- персонаж уже есть
if player.Character then task.spawn(OnCharacter, player.Character) 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) и убедись:

Собрать вспышку одной командой