Roblox · Дополнительное
Дёрнул рычаг (E) — ручка наклоняется, дверь плавно уезжает вверх; ещё раз — опускается. Можно включить автозакрытие через несколько секунд.
Синим — что нужно создать.
Workspace └─ LeverDoor (Model) ├─ Door (Part) — Anchored; внутри Sound «Move» ├─ LeverBase (Part) — основание рычага │ └─ ProximityPrompt (ProximityPrompt) ├─ Lever (Part) — ручка — стоит на основании ├─ Configuration (Configuration) — OpenHeight, Time, AutoClose └─ LeverDoorServer (Script)
Где: 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) и убедись: