Як зробити двері в Роблокс Студіо, що відчиняються на E
За 15 хвилин зробимо двері, які плавно відчиняються, коли гравець натискає E (або кнопку на екрані телефона), і самі зачиняються через кілька секунд. Потрібні одна деталь, ProximityPrompt і короткий скрипт.
- ProximityPrompt: підказка «Натисни E»
- Плавне обертання на петлі через TweenService
- Автозакриття й захист від подвійних натискань
Покроково
Створи деталь дверей
У вкладці Home (або Model) натисни Part — у світі з’явиться блок. У вікні Properties задай Size 4, 7, 0.5, щоб вийшли двері, і перейменуй деталь на Door. Обов’язково увімкни Anchored, інакше двері впадуть або відлетять.
Додай ProximityPrompt
В Explorer наведи курсор на Door, натисни «+» і вибери ProximityPrompt. Саме він показує гравцеві підказку «Натисни E», коли той підходить ближче. Назву об’єкта не змінюй: скрипт шукає його саме як ProximityPrompt.
Додай Script у двері
Знову натисни «+» біля Door і вибери Script — саме Script, а не LocalScript: двері мають відчинятися на сервері, щоб їх бачили всі гравці. Видали рядок print("Hello world!"), який Studio додає автоматично.
Встав код
Скопіюй перший скрипт нижче й встав його у Script. Перечитай коментарі: кожен рядок пояснено. Налаштування винесено на початок, тож OPEN_ANGLE, OPEN_TIME і AUTO_CLOSE_DELAY можна змінювати, не чіпаючи решту коду.
Протестуй гру
Натисни Play (F5), підійди до дверей і натисни E. Двері мають плавно повернутися на 90 градусів, постояти відчиненими три секунди й зачинитися. На телефоні замість E з’явиться кнопка на екрані, а на геймпаді — кнопка X.
Перевір петлю
Якщо двері обертаються не навколо того краю або «заходять» у стіну, зміни знак кута: OPEN_ANGLE = -90. Можна також перенести петлю на інший край, замінивши -door.Size.X / 2 на door.Size.X / 2 у рядку з hinge.
Спробуй розсувні двері
Хочеш двері, як у космічному кораблі? Візьми другий скрипт нижче: там двері не обертаються, а зсуваються вбік на власну ширину. Решта — ProximityPrompt, автозакриття й debounce — працює так само, як у першому варіанті.
Скрипт
-- Script: поклади цей скрипт всередину деталі Door (поруч із ProximityPrompt)
local TweenService = game:GetService("TweenService") -- сервіс для плавних анімацій
local door = script.Parent -- деталь дверей, у якій лежить цей скрипт
local prompt = door:WaitForChild("ProximityPrompt") -- підказка «Натисни E» всередині Door
-- Налаштування (їх можна змінювати)
local OPEN_ANGLE = 90 -- на скільки градусів відчиняються двері (спробуй -90)
local OPEN_TIME = 0.6 -- скільки секунд триває відчинення
local AUTO_CLOSE_DELAY = 3 -- через скільки секунд двері зачиняться самі
-- Запам’ятовуємо положення зачинених дверей
local closedCFrame = door.CFrame
-- Петля — лівий край дверей: зсув на половину ширини від центру
local hinge = CFrame.new(-door.Size.X / 2, 0, 0)
-- Відчинене положення: переходимо до петлі, повертаємо навколо осі Y і повертаємося назад
local openCFrame = closedCFrame * hinge * CFrame.Angles(0, math.rad(OPEN_ANGLE), 0) * hinge:Inverse()
-- Параметри анімації: тривалість, стиль і напрям згладжування
local tweenInfo = TweenInfo.new(OPEN_TIME, Enum.EasingStyle.Quad, Enum.EasingDirection.Out)
-- Готуємо дві анімації заздалегідь: відчинити й зачинити
local openTween = TweenService:Create(door, tweenInfo, { CFrame = openCFrame })
local closeTween = TweenService:Create(door, tweenInfo, { CFrame = closedCFrame })
-- Тексти й параметри підказки
prompt.ObjectText = "Двері" -- назва об’єкта
prompt.ActionText = "Відчинити" -- що станеться після натискання
prompt.HoldDuration = 0 -- 0 = достатньо просто натиснути, без утримання
prompt.MaxActivationDistance = 8 -- з якої відстані (у studs) з’являється підказка
local isBusy = false -- debounce: true, поки двері рухаються
prompt.Triggered:Connect(function(player)
if isBusy then
return -- двері вже в русі, тому ігноруємо повторне натискання
end
isBusy = true
prompt.Enabled = false -- ховаємо підказку, поки двері відчинені
print(player.Name .. " відчиняє двері") -- повідомлення у вікні Output
openTween:Play() -- запускаємо анімацію відчинення
openTween.Completed:Wait() -- чекаємо, поки двері повністю відчиняться
task.wait(AUTO_CLOSE_DELAY) -- двері кілька секунд стоять відчинені
closeTween:Play() -- запускаємо анімацію закриття
closeTween.Completed:Wait() -- чекаємо, поки двері зачиняться
prompt.Enabled = true -- знову показуємо підказку
isBusy = false -- двері готові до наступного натискання
end)
-- Script: розсувні двері. Поклади всередину Door разом із ProximityPrompt
local TweenService = game:GetService("TweenService") -- сервіс для плавних анімацій
local door = script.Parent -- деталь дверей
local prompt = door:WaitForChild("ProximityPrompt") -- підказка «Натисни E»
local OPEN_TIME = 0.8 -- тривалість руху, секунди
local AUTO_CLOSE_DELAY = 3 -- пауза перед автоматичним закриттям, секунди
local closedCFrame = door.CFrame -- положення зачинених дверей
-- Зсуваємо двері вбік уздовж їхньої власної осі X на всю ширину
local openCFrame = closedCFrame * CFrame.new(door.Size.X, 0, 0)
-- Sine + InOut: двері плавно рушають і плавно зупиняються
local tweenInfo = TweenInfo.new(OPEN_TIME, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut)
local openTween = TweenService:Create(door, tweenInfo, { CFrame = openCFrame })
local closeTween = TweenService:Create(door, tweenInfo, { CFrame = closedCFrame })
prompt.ObjectText = "Розсувні двері"
prompt.ActionText = "Відчинити"
local isBusy = false -- debounce: не даємо запустити двері повторно, поки вони рухаються
prompt.Triggered:Connect(function()
if isBusy then
return -- двері вже рухаються
end
isBusy = true
prompt.Enabled = false -- ховаємо підказку
openTween:Play() -- відсуваємо двері
openTween.Completed:Wait() -- чекаємо кінця анімації
task.wait(AUTO_CLOSE_DELAY) -- двері стоять відчинені
closeTween:Play() -- засуваємо назад
closeTween.Completed:Wait() -- чекаємо кінця анімації
prompt.Enabled = true -- підказка знову доступна
isBusy = false
end)
Не працює? Типові помилки
Увімкни Anchored у властивостях Door. TweenService змінює CFrame, а незакріплена деталь підкоряється фізиці й гравітації, тож анімація поводиться непередбачувано.
Перевір, що це Script, а не LocalScript: LocalScript у Workspace не запускається. Також переконайся, що скрипт лежить усередині Door, а не просто в Workspace.
Скрипт не знаходить підказку. ProximityPrompt має лежати всередині Door і називатися саме ProximityPrompt. Якщо ти його перейменував, зміни назву й у рядку з WaitForChild.
Підійди ближче або збільш MaxActivationDistance. Якщо двері вбудовані в стіну, вона може закривати огляд, — вимкни RequiresLineOfSight у властивостях ProximityPrompt.
Як зробити двері в Роблокс Студіо: що ми побудуємо
Двері — одна з перших механік, яку хочеться додати в гру: будинок, секретна кімната, вихід із рівня в obby чи страшний коридор у хорор-грі. У цьому туторіалі розбираємо, як зробити двері в Роблокс Студіо так, як їх роблять у сучасних іграх: з підказкою «Натисни E», плавною анімацією й автоматичним закриттям.
Що ти дізнаєшся:
- як працює ProximityPrompt — готова підказка для взаємодії з об’єктами;
- як за допомогою TweenService плавно рухати й обертати деталі;
- що таке debounce і чому без нього двері «ламаються», якщо натискати E багато разів;
- як обертати деталь не навколо центру, а навколо петлі.
Потрібна лише Roblox Studio на комп’ютері з Windows або Mac. Досвід програмування не обов’язковий: кожен рядок коду має коментар українською.
Як працюють ProximityPrompt і TweenService
ProximityPrompt — це об’єкт, який показує гравцеві підказку, коли той підходить до деталі. Він працює, якщо лежить усередині деталі (BasePart), вкладення (Attachment) або моделі з призначеною PrimaryPart. Коли гравець натискає клавішу, спрацьовує подія Triggered, і до неї ми «підключаємо» свою функцію. Підказка сама підлаштовується під пристрій: клавіша E на клавіатурі, кнопка на екрані телефона, кнопка X на геймпаді.
TweenService створює плавні анімації властивостей. Ми передаємо йому три речі: що анімувати (двері), як (TweenInfo: тривалість і стиль згладжування) і до якого значення (новий CFrame). Метод Play запускає анімацію, а подія Completed повідомляє, що вона завершилася.
Debounce у нашому коді — змінна isBusy. Поки двері рухаються, вона дорівнює true, і повторні натискання ігноруються. Додатково ми вимикаємо підказку (prompt.Enabled = false), щоб гравець не бачив кнопку, яка зараз нічого не робить.
Трохи математики: як двері обертаються на петлі
Якщо просто повернути деталь, вона обернеться навколо свого центру — як турнікет, а не як двері. Тому в скрипті є три кроки в одному рядку:
- closedCFrame * hinge — переносимо точку обертання з центру дверей до лівого краю, де мала б бути петля (на половину ширини, door.Size.X / 2).
- CFrame.Angles(0, math.rad(OPEN_ANGLE), 0) — повертаємо навколо вертикальної осі Y. Функція math.rad переводить градуси в радіани, бо Roblox рахує кути саме в радіанах.
- hinge:Inverse() — повертаємося від петлі назад до центру дверей.
Результат — нове положення дверей, у якому лівий край залишився на місці, а решта повернулася на 90 градусів. Цю позицію ми обчислюємо один раз на початку й зберігаємо в змінній openCFrame. Так само, до речі, роблять кришки скринь, шлагбауми й ворота замків — змінюються лише вісь і кут.
Як покращити двері: ідеї для практики
Тепер, коли ти знаєш, як зробити двері в Роблокс Студіо, спробуй додати щось своє:
- Звук. Додай у Door об’єкт Sound і викликай sound:Play() перед openTween:Play().
- Двері з ключем. У функції Triggered перевір, чи є в гравця інструмент Key (у Backpack або в руках), і відчиняй лише тоді.
- Утримання клавіші. Постав HoldDuration = 1 — гравцеві доведеться тримати E секунду, як біля сейфа.
- Двері в обидва боки. Порівняй позицію гравця з дверима й обирай знак кута так, щоб двері відчинялися від нього.
- Командні двері. Відчиняй їх лише для гравців певної команди (player.Team).
Кожна з цих ідей — окрема маленька задача з умовами й перевірками. Спробуй реалізувати хоча б одну самостійно: саме на таких задачах найкраще тренується мислення програміста.
Для батьків: чого вчить цей маленький проєкт
За простими дверима стоять справжні поняття програмування: змінні й константи, події та функції, умови, робота з координатами й захист від повторних дій (debounce). Дитина бачить результат коду одразу в 3D-світі — і саме тому Roblox Studio добре підходить як перший крок у розробку.
Проте самостійне навчання часто зупиняється, коли скрипт не працює, а знайти помилку не вдається. На індивідуальних уроках Excklusive-IT наставник допомагає не лише виправити код, а й зрозуміти, чому він працює саме так. Урок триває 60 хвилин у Zoom, проходить українською або англійською, для дітей 8–17 років.
Хочете, щоб ваша дитина створювала повноцінні ігри, а не лише окремі механіки? Перший урок 1-на-1 — безкоштовно. Записатися можна на сторінці безкоштовного уроку, а програму курсу переглянути на сторінці Roblox Studio.
Питання, які ставлять батьки
Чи працюватимуть двері на телефоні?
Так. ProximityPrompt сам підлаштовується під пристрій: на комп’ютері показує клавішу E, на телефоні чи планшеті — кнопку, яку можна натиснути пальцем, а на геймпаді — кнопку X. Нічого додатково програмувати не потрібно.
Чому Script, а не LocalScript?
Script виконується на сервері, тому зміни бачать усі гравці: якщо один відчинив двері, вони відчинені для всіх. LocalScript працює лише на пристрої одного гравця, а в Workspace взагалі не запускається. Для спільних об’єктів у світі гри використовуй Script.
Як зробити, щоб двері відчинялися тільки з ключем?
У функції, яку викликає Triggered, перевір, чи є в гравця інструмент із назвою Key: у player.Backpack або в його персонажі, якщо інструмент у руках. Для цього підійде метод FindFirstChild. Якщо ключа немає, просто вийди з функції через return.
Чи можна зробити двері з кількох деталей?
Так. Згрупуй деталі в модель, обери одну головну деталь і з’єднай із нею решту за допомогою WeldConstraint. Закріпленою (Anchored) залиш лише головну деталь, а ProximityPrompt і скрипт поклади в неї. Тоді анімація головної деталі потягне за собою всі інші.
Навіщо чекати Completed, якщо можна просто написати task.wait?
Completed:Wait() чекає рівно стільки, скільки триває анімація, навіть якщо ти зміниш OPEN_TIME. Якщо ж писати task.wait з числом уручну, легко помилитися, і двері почнуть зачинятися ще до того, як повністю відчиняться.
Від дверей — до власної гри
Перший урок 1-на-1 з наставником безкоштовний: 60 хвилин у Zoom, Roblox Studio і Luau українською. Для дітей 8–17 років.
Записатися на безкоштовний урокЗапишіться на безкоштовний урок
Без зобовʼязань. Без оплати. Просто перший урок для вашої дитини.
Або напишіть нам напряму
Натисніть на месенджер — чат відкриється з готовим привітанням.
- +1 (289) 44-28-698
- excklusiveit@gmail.com
-
Години роботи — Гамільтон, Онтаріо (ET) Пн–Пт: 9:00–18:00 Сб–Нд: 8:00–16:00
- Онлайн по всьому світу · клас у Гамільтоні: 170 Parkdale Ave N, Hamilton, ON L8H 5X2