Roblox · Дополнительное

Дверь с рычагом

Дёрнул рычаг (E) — ручка наклоняется, дверь плавно уезжает вверх; ещё раз — опускается. Можно включить автозакрытие через несколько секунд.

Структура

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

Workspace
└─ LeverDoor (Model)
   ├─ Door (Part) — Anchored; внутри Sound «Move»
   ├─ LeverBase (Part) — основание рычага
   │  └─ ProximityPrompt (ProximityPrompt)
   ├─ Lever (Part) — ручка — стоит на основании
   ├─ Configuration (Configuration) — OpenHeight, Time, AutoClose
   └─ LeverDoorServer (Script)

Шаги

  1. Модель «LeverDoor»: дверь «Door» в проёме, рычаг — основание «LeverBase» (в нём ProximityPrompt) и ручка «Lever». Все детали Anchored.
  2. Configuration: OpenHeight — на сколько поднять дверь (обычно её высота), Time — за сколько секунд, AutoClose — через сколько секунд закрыть само (0 — не закрывать).
  3. Как работает: TweenService двигает Anchored-дверь вверх и обратно; ручка поворачивается вокруг верха основания. Пока дверь едет, повторное нажатие не принимается.
  4. Вместо рычага подойдёт кнопка: любая деталь с именем LeverBase и ProximityPrompt.

Скрипты

LeverDoorServer

Где: Workspace → LeverDoor · Script
Зачем: Рычаг открывает и закрывает дверь.

-- плавное движение
local TS = game:GetService("TweenService")
-- модель двери с рычагом
local model = script.Parent
-- дверь
local door = model:WaitForChild("Door")
-- основание рычага
local base = model:WaitForChild("LeverBase")
-- ручка рычага
local lever = model:WaitForChild("Lever")
-- надпись «Открыть»
local prompt = base:WaitForChild("ProximityPrompt")
-- настройки
local config = model:WaitForChild("Configuration")
-- дверь закрыта
local closedCF = door.CFrame
-- дверь открыта — поднята вверх
local openCF = closedCF + Vector3.new(0, config.OpenHeight.Value, 0)
-- точка, вокруг которой качается ручка
local pivot = base.CFrame * CFrame.new(0, base.Size.Y / 2, 0)
-- открыта?
local open = false
-- двигается?
local moving = false

-- наклонить ручку
local function SetLever(on)
    -- вперёд — открыто, назад — закрыто
    local angle = math.rad(on and -40 or 40)
    -- ручка стоит на основании под углом
    local goal = pivot * CFrame.Angles(angle, 0, 0) * CFrame.new(0, lever.Size.Y / 2, 0)
    -- плавно
    TS:Create(lever, TweenInfo.new(0.3), {CFrame = goal}):Play()
-- конец функции
end

-- открыть (true) или закрыть (false)
local function Set(state)
    -- уже двигается или уже так
    if moving or open == state then return end
    -- двигается
    moving = true
    -- новое состояние
    open = state
    -- надпись
    prompt.ActionText = open and "Закрыть" or "Открыть"
    -- ручка
    SetLever(open)
    -- звук двери
    local sound = door:FindFirstChild("Move")
    -- играем
    if sound then sound:Play() end
    -- дверь едет
    local tween = TS:Create(door, TweenInfo.new(config.Time.Value, Enum.EasingStyle.Quad), {CFrame = open and openCF or closedCF})
    -- запускаем
    tween:Play()
    -- ждём
    tween.Completed:Wait()
    -- можно снова
    moving = false
-- конец функции
end

-- в начале — закрыто
SetLever(false)
-- игрок дёрнул рычаг
prompt.Triggered:Connect(function()
    -- переключаем
    Set(not open)
    -- автозакрытие включено
    if open and config.AutoClose.Value > 0 then
        -- через AutoClose секунд закроется само
        task.delay(config.AutoClose.Value, function() Set(false) end)
    -- конец проверки
    end
-- конец обработчика
end)

Проверка

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

Собрать дверь с рычагом одной командой