Туториал Roblox Studio · Luau

Как сделать дверь в Роблокс Студио: открытие по клавише E

Как сделать дверь в Роблокс Студио, которая открывается по клавише E, плавно отъезжает и сама закрывается? Разбираем по шагам — с готовым скриптом на Luau и комментариями на русском.

  • ProximityPrompt: открыть по клавише E
  • Плавная анимация через TweenService
  • Автозакрытие и защита от спама

Пошагово

  1. Сделайте дверь

    Добавьте блок кнопкой Part. В Properties задайте Size = 4, 7, 0.5 (ширина, высота, толщина) и поставьте блок в проём стены. Переименуйте его в Door: дважды щёлкните по имени в окне Explorer.

  2. Закрепите дверь

    В Properties у Door включите Anchored. Закреплённый блок не падает и не толкается от ударов, а двигать его мы будем сами — скриптом. Без Anchored дверь просто упадёт при запуске игры.

  3. Добавьте ProximityPrompt

    В Explorer наведите курсор на Door, нажмите плюс и выберите ProximityPrompt. Это подсказка «E — Открыть», которая появляется рядом с объектом. ProximityPrompt должен лежать прямо внутри Door и называться ProximityPrompt.

  4. Добавьте Script

    Снова нажмите плюс на Door и выберите Script — обычный серверный скрипт, не LocalScript. Удалите строку print("Hello world!") и вставьте код из первого блока ниже. Скрипт должен лежать рядом с ProximityPrompt.

  5. Настройте направление

    Дверь уезжает вдоль своей оси X на свою ширину. Если она едет не в ту сторону, поставьте минус: CFrame.new(-door.Size.X, 0, 0). Чтобы дверь поднималась вверх, как ворота, используйте CFrame.new(0, door.Size.Y, 0).

  6. Проверьте игру

    Нажмите Play, подойдите к двери и нажмите E. Дверь плавно отъедет, подсказка исчезнет, а через 3 секунды дверь вернётся на место. Если что-то не так, откройте окно Output: там будет текст ошибки.

Скрипт

Script — положите внутрь части Door (рядом с ProximityPrompt)
-- Раздвижная дверь: открывается по клавише 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)
Вариант: распашная дверь на петлях — Script внутри Door вместо первого
-- Распашная дверь на петлях: поворачивается вокруг левого края
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: скрипт двигает дверь сам, физика ей не нужна.

В Output ошибка Infinite yield possible on Door:WaitForChild("ProximityPrompt")

ProximityPrompt лежит не внутри Door или переименован. Перетащите его в Door в окне Explorer и верните имя ProximityPrompt.

Подсказка «E» не появляется

Проверьте, что у 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 с наставником, онлайн на русском.

Записаться на бесплатный урок

Запишитесь на бесплатный урок

Гарантия возврата денег Не подошло? Вернём деньги за неиспользованные уроки в течение 14 дней.
CA$70 за индивидуальный урок 60 мин ≈ US$50. Крупные школы США берут US$60–75 за 50–60 минут.
Один наставник, вживую, 1-на-1 На русском, украинском или английском. Проверка Vulnerable Sector Check. Родители могут присутствовать.