Roblox · Хоррор · урок 4

Скримеры

Пугалки: тень, которая мелькает и исчезает, крик вдалеке, глаза во тьме и резкая картинка на весь экран.

Структура

Синим — что добавляем на этом уроке.

Workspace
├─ ShadowTrigger (Part) — невидимая зона
│  └─ ShadowTrigger (Script)
├─ Eyes (Model) — два светящихся глаза
├─ EnvironmentTrigger (Part)
│  ├─ Footsteps (Sound) — шаги
│  └─ EnvironmentTrigger (Script)
└─ JumpscareTrigger (Part)
ServerStorage
└─ Shadow (Model) — тень; внутри Sound
SoundService
└─ Scream (Sound) — крик
ServerScriptService
└─ ScreamScript (Script)
StarterGui
└─ JumpscareGui (ScreenGui) — Enabled выкл., ResetOnSpawn выкл., IgnoreGuiInset вкл.
   ├─ Face (ImageLabel) — на весь экран
   ├─ Scream (Sound)
   └─ JumpscareLocal (LocalScript)

Шаги

  1. Триггер — невидимая деталь поперёк дороги: Transparency 1, CanCollide выкл., Anchored. Игрок проходит сквозь и запускает событие.
  2. Тень: высокая чёрная фигура в стороне от тропинки, внутри Sound со шёпотом. Построй на месте, сгруппируй в модель «Shadow» и перетащи в ServerStorage — скрипт поставит её туда же, где строил.
  3. Крик: SoundService → Sound «Scream». ServerScriptService → Script «ScreamScript». Звуки в SoundService слышат все; из ServerScriptService звук до игроков не доходит.
  4. Глаза: модель «Eyes» из двух красных Neon-шариков в конце коридора. Триггер «EnvironmentTrigger» перед ними, в нём Sound «Footsteps» — глаза пропадают, и слышны шаги.
  5. Звуки: Toolbox → Audio, найди «scream», «footsteps», «whisper». Вставь ID в SoundId.
  6. Скример: StarterGui → ScreenGui «JumpscareGui» (Enabled выкл., ResetOnSpawn выкл., IgnoreGuiInset вкл.). Внутри ImageLabel «Face» во весь экран (Size {1,0},{1,0}), Sound «Scream», LocalScript «JumpscareLocal».
  7. Триггер «JumpscareTrigger» лежит прямо в Workspace — его ищет локальный скрипт. Скример проверяется на стороне игрока: каждый пугается сам по себе и только один раз.

Скрипты

ShadowTrigger

Где: Workspace → ShadowTrigger · Script
Зачем: Тень появляется на 5 секунд.

-- здесь лежит тень
local SS = game:GetService("ServerStorage")
-- игроки
local Players = game:GetService("Players")
-- невидимая зона
local trigger = script.Parent
-- сколько секунд тень стоит
local SHOW_TIME = 5
-- срабатывает один раз за игру
local used = false

-- касание зоны
trigger.Touched:Connect(function(hit)
    -- уже было или это не игрок
    if used or not Players:GetPlayerFromCharacter(hit.Parent) then return end
    -- больше не срабатывает
    used = true
    -- копия тени — на том месте, где её построили
    local shadow = SS:WaitForChild("Shadow"):Clone()
    -- появляется
    shadow.Parent = workspace
    -- звук внутри тени
    local sound = shadow:FindFirstChildWhichIsA("Sound", true)
    -- шёпот
    if sound then sound:Play() end
    -- стоит
    task.wait(SHOW_TIME)
    -- исчезает
    shadow:Destroy()
-- конец функции
end)

ScreamScript

Где: ServerScriptService · Script
Зачем: Крик в случайный момент.

-- звуки отсюда слышат все игроки
local SoundService = game:GetService("SoundService")
-- крик
local scream = SoundService:WaitForChild("Scream")
-- не раньше чем через 45 секунд
local MIN_TIME = 45
-- и не позже чем через 90
local MAX_TIME = 90

-- бесконечно
while true do
    -- случайная пауза — нельзя привыкнуть
    task.wait(math.random(MIN_TIME, MAX_TIME))
    -- крик где-то вдалеке
    scream:Play()
-- конец цикла
end

EnvironmentTrigger

Где: Workspace → EnvironmentTrigger · Script
Зачем: Глаза пропадают, слышны шаги.

-- игроки
local Players = game:GetService("Players")
-- зона
local trigger = script.Parent
-- глаза в темноте
local eyes = workspace:WaitForChild("Eyes")
-- шаги
local footsteps = trigger:WaitForChild("Footsteps")
-- один раз
local used = false

-- касание
trigger.Touched:Connect(function(hit)
    -- уже было или не игрок
    if used or not Players:GetPlayerFromCharacter(hit.Parent) then return end
    -- больше не срабатывает
    used = true
    -- глаза пропали
    eyes:Destroy()
    -- и кто-то пошёл
    footsteps:Play()
-- конец функции
end)

JumpscareLocal

Где: StarterGui → JumpscareGui · LocalScript
Зачем: Картинка и крик на 1.5 секунды.

-- игроки
local Players = game:GetService("Players")
-- этот игрок
local player = Players.LocalPlayer
-- JumpscareGui
local gui = script.Parent
-- звук скримера
local scream = gui:WaitForChild("Scream")
-- зона
local trigger = workspace:WaitForChild("JumpscareTrigger")
-- сколько секунд картинка на экране
local SHOW_TIME = 1.5
-- каждый игрок пугается один раз
local used = false

-- касание зоны
trigger.Touched:Connect(function(hit)
    -- уже было или это не мы
    if used or hit.Parent ~= player.Character then return end
    -- больше не срабатывает
    used = true
    -- картинка на весь экран
    gui.Enabled = true
    -- крик
    scream:Play()
    -- держим
    task.wait(SHOW_TIME)
    -- прячем, но не удаляем
    gui.Enabled = false
-- конец функции
end)

Проверка

Запусти Play (или Run) и убедись: