Как сделать дверь в Роблокс Студио: открытие по клавише E
Как сделать дверь в Роблокс Студио, которая открывается по клавише E, плавно отъезжает и сама закрывается? Разбираем по шагам — с готовым скриптом на Luau и комментариями на русском.
- ProximityPrompt: открыть по клавише E
- Плавная анимация через TweenService
- Автозакрытие и защита от спама
Пошагово
Сделайте дверь
Добавьте блок кнопкой Part. В Properties задайте Size = 4, 7, 0.5 (ширина, высота, толщина) и поставьте блок в проём стены. Переименуйте его в Door: дважды щёлкните по имени в окне Explorer.
Закрепите дверь
В Properties у Door включите Anchored. Закреплённый блок не падает и не толкается от ударов, а двигать его мы будем сами — скриптом. Без Anchored дверь просто упадёт при запуске игры.
Добавьте ProximityPrompt
В Explorer наведите курсор на Door, нажмите плюс и выберите ProximityPrompt. Это подсказка «E — Открыть», которая появляется рядом с объектом. ProximityPrompt должен лежать прямо внутри Door и называться ProximityPrompt.
Добавьте Script
Снова нажмите плюс на Door и выберите Script — обычный серверный скрипт, не LocalScript. Удалите строку print("Hello world!") и вставьте код из первого блока ниже. Скрипт должен лежать рядом с ProximityPrompt.
Настройте направление
Дверь уезжает вдоль своей оси X на свою ширину. Если она едет не в ту сторону, поставьте минус: CFrame.new(-door.Size.X, 0, 0). Чтобы дверь поднималась вверх, как ворота, используйте CFrame.new(0, door.Size.Y, 0).
Проверьте игру
Нажмите Play, подойдите к двери и нажмите E. Дверь плавно отъедет, подсказка исчезнет, а через 3 секунды дверь вернётся на место. Если что-то не так, откройте окно Output: там будет текст ошибки.
Скрипт
-- Раздвижная дверь: открывается по клавише E и сама закрывается через несколько секунд
local TweenService = game:GetService("TweenService")
local door = script.Parent -- сама дверь (скрипт лежит внутри неё)
local prompt = door:WaitForChild("ProximityPrompt") -- подсказка «E — Открыть»
-- Настройки: меняйте под свою игру
local OPEN_TIME = 0.6 -- сколько секунд длится анимация
local AUTO_CLOSE_DELAY = 3 -- через сколько секунд дверь закроется сама
-- Запоминаем, где дверь стоит закрытой, и считаем, где она будет открытой:
-- дверь уезжает вбок вдоль своей оси X ровно на свою ширину
local closedCFrame = door.CFrame
local openCFrame = closedCFrame * CFrame.new(door.Size.X, 0, 0)
-- Готовим две анимации заранее: «открыть» и «закрыть»
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.ActionText = "Открыть"
prompt.ObjectText = "Дверь"
-- Debounce: пока дверь двигается или открыта, новые нажатия не считаются
local isBusy = false
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)
-- Распашная дверь на петлях: поворачивается вокруг левого края
local TweenService = game:GetService("TweenService")
local door = script.Parent
local prompt = door:WaitForChild("ProximityPrompt")
local OPEN_ANGLE = 90 -- на сколько градусов открывается дверь (-90 — в другую сторону)
local OPEN_TIME = 0.8 -- длительность анимации в секундах
local AUTO_CLOSE_DELAY = 3 -- через сколько секунд дверь закроется сама
-- Петля — это левый край двери. Считаем её положение от закрытой двери
local closedCFrame = door.CFrame
local hingeCFrame = closedCFrame * CFrame.new(-door.Size.X / 2, 0, 0)
local hingeToCenter = CFrame.new(door.Size.X / 2, 0, 0) -- от петли до центра двери
-- Твином будем менять не саму дверь, а число — текущий угол открытия
local angle = Instance.new("NumberValue")
angle.Value = 0
angle.Parent = script
-- Каждый раз, когда угол меняется, ставим дверь на нужное место вокруг петли
angle.Changed:Connect(function(value)
door.CFrame = hingeCFrame * CFrame.Angles(0, math.rad(value), 0) * hingeToCenter
end)
local tweenInfo = TweenInfo.new(OPEN_TIME, Enum.EasingStyle.Quad, Enum.EasingDirection.Out)
local openTween = TweenService:Create(angle, tweenInfo, { Value = OPEN_ANGLE })
local closeTween = TweenService:Create(angle, tweenInfo, { Value = 0 })
prompt.ActionText = "Открыть"
prompt.ObjectText = "Дверь"
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)
Не работает? Частые ошибки
У части Door выключен Anchored. Включите его в Properties: скрипт двигает дверь сам, физика ей не нужна.
ProximityPrompt лежит не внутри Door или переименован. Перетащите его в Door в окне Explorer и верните имя ProximityPrompt.
Проверьте, что у ProximityPrompt включён Enabled и вы подходите ближе, чем MaxActivationDistance (по умолчанию 10 стадов). Если дверь утоплена в стену, выключите RequiresLineOfSight.
Скорее всего, добавлен LocalScript вместо Script. LocalScript не запускается внутри частей в Workspace. Удалите его и добавьте обычный Script с тем же кодом.
Как сделать дверь в Роблокс Студио: как работает скрипт
Прежде чем копировать код, разберёмся, из чего он состоит. Понять, как сделать дверь в Роблокс Студио, — значит понять четыре вещи, и тогда вы сможете переделать дверь под свою игру.
- ProximityPrompt — встроенная подсказка Roblox. Когда игрок подходит близко, появляется надпись «E — Открыть», а при нажатии срабатывает событие Triggered. Оно передаёт в скрипт игрока, который нажал кнопку. На телефоне и геймпаде подсказка работает тоже.
- TweenService — сервис плавной анимации. Мы говорим ему: «передвинь дверь из положения A в положение B за 0,6 секунды», и он сам рассчитывает все промежуточные кадры.
- CFrame — положение и поворот объекта одновременно. Запоминаем CFrame закрытой двери и считаем CFrame открытой.
- Debounce — переменная isBusy. Пока дверь двигается, новые нажатия игнорируются, иначе анимации будут накладываться, и дверь застрянет посередине.
Автозакрытие — это пауза task.wait(3) между двумя анимациями. Важно, что скрипт серверный: дверь откроется у всех игроков сразу, а не только у того, кто нажал E.
Распашная дверь на петлях
Первый скрипт показывает, как сделать дверь в Роблокс Студио раздвижной: она уезжает вбок. Если нужна обычная дверь, которая поворачивается на петлях, используйте второй скрипт. В нём есть хитрость: если твинить CFrame двери напрямую, в конце она окажется где нужно, но по пути будет «плыть» и отрываться от петли.
Поэтому мы анимируем не саму дверь, а невидимое число — объект NumberValue, в котором хранится угол от 0 до 90 градусов. TweenService плавно меняет это число, а каждый раз, когда оно меняется, скрипт ставит дверь в нужное положение относительно петли — левого края двери. Получается правильная дуга.
Поэкспериментируйте: поменяйте OPEN_ANGLE на -90, чтобы дверь открывалась в другую сторону, или перенесите петлю на правый край — уберите минус в строке с hingeCFrame и добавьте его в hingeToCenter. Такие правки — лучший способ понять, как устроены CFrame.
Идеи, как улучшить дверь
- Дверь по ключу. В обработчике Triggered проверьте, есть ли у игрока инструмент Key в рюкзаке или в руках, и открывайте дверь только тогда.
- Звук. Добавьте в Door объект Sound и вызывайте его Play() перед openTween:Play().
- Платная дверь. Откройте проход только тем, у кого хватает монет, — монеты и проверку на сервере разбираем в туториале про магазин в Роблокс Студио.
- Двойные двери. Две створки: одна едет влево, другая вправо.
Все эти улучшения опираются на те же приёмы: событие, проверка условия, анимация. Если дверь уже работает, возьмите одну идею и попробуйте сделать её сами. Следующий шаг — как сделать телепорт в Роблокс Студио, а общий план создания игры — в гайде как сделать игру в Роблокс.
Заметка для родителей
Этот туториал рассчитан на детей 10–16 лет, которые уже открывали Roblox Studio. Если ребёнок разобрался, как сделать дверь в Роблокс Студио, по этой инструкции — отлично, но главный вопрос в другом: может ли он объяснить, зачем нужна переменная isBusy и что будет, если её убрать. Попросите его рассказать — это лучший тест на понимание, а не на копирование.
В скрипте около сорока строк, но в них события, условия, переменные, работа с сервисами и паузы — те же понятия, что потом встречаются в Python, JavaScript и любом другом языке. Roblox хорош тем, что результат виден сразу, и ребёнку хочется разобраться, а не просто дойти до конца урока.
Хотите, чтобы ребёнок делал целые игры?
Дверь — одна механика. Полноценная игра — это десятки механик, которые работают вместе: сохранение прогресса, магазин, раунды, интерфейс. На уроках в Excklusive-IT ребёнок строит такую игру с наставником 1-на-1: 60 минут в Zoom, на русском, украинском или английском, в удобное время в вашем часовом поясе.
Подросткам 14–17 лет подходит программа Roblox + AI: 4 урока в месяц по 120 минут, на первом из них за одну сессию собирается полноценный шутер, а дальше — 3D-модели, анимации и эффекты с помощью AI-инструментов. Хотите, чтобы ребёнок делал целые игры вроде этой? Первый урок 1-на-1 — бесплатно. Подробнее — на странице курса Roblox.
Вопросы, которые задают родители
Почему нужен Script, а не LocalScript?
Script работает на сервере, поэтому дверь открывается у всех игроков одновременно. LocalScript работает только у одного игрока и внутри частей в Workspace вообще не запускается. Для дверей, которые видят все, всегда используйте обычный Script.
Как сделать, чтобы дверь открывалась сама, когда подходишь?
Можно использовать событие Touched на невидимой части перед дверью — так же, как в нашем туториале про телепорт. Но ProximityPrompt удобнее: он работает на компьютере, телефоне и геймпаде, а игрок сам решает, когда открыть дверь.
Как поменять надпись на подсказке?
За надпись отвечают свойства ActionText и ObjectText. В нашем скрипте они задаются строками prompt.ActionText = "Открыть" и prompt.ObjectText = "Дверь". Поменяйте текст в кавычках, например на «Войти» и «Замок». Писать можно на любом языке, в том числе на русском.
Как сделать, чтобы кнопку нужно было удерживать?
У ProximityPrompt есть свойство HoldDuration — сколько секунд нужно удерживать клавишу. По умолчанию оно равно 0, и дверь открывается сразу. Поставьте, например, 1 — и вокруг подсказки появится полоска заполнения. Это удобно для важных дверей, которые не должны открываться случайно.
Можно ли сделать дверь, которая остаётся открытой?
Да. Уберите из скрипта строки с task.wait, closeTween и повторным включением подсказки. Или сделайте переключатель: храните переменную isOpen и по каждому нажатию проигрывайте то openTween, то closeTween. Защиту isBusy оставьте, чтобы анимации не накладывались.
Первый урок Roblox 1-на-1 — бесплатно
Хотите, чтобы ребёнок не копировал код, а понимал его? Запишитесь на бесплатный урок: 60 минут в Roblox Studio с наставником, онлайн на русском.
Записаться на бесплатный урокЗапишитесь на бесплатный урок
Без обязательств. Без оплаты. Просто первый урок для вашего ребёнка.
Или напишите нам напрямую
Нажмите на мессенджер — чат откроется с готовым приветствием.
- +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