Лифт по вызову: вверх и вниз
У лифта две кнопки вызова и плавное движение платформы.
Плавный подъём и спуск платформы по нажатию E.
1. Подготовьте объект
Где разместить: Отдельные блоки кода: создайте файлы в указанных местах
В Workspace создайте Part ElevatorPlatform (Anchored=true, CanCollide=true) и два Part CallBottom и CallTop (Anchored=true).
Поставьте платформу в нижнее положение. Кнопку CallTop разместите на высоте верхнего этажа; её разница по Y с CallBottom задаёт высоту подъёма.
В ServerScriptService создайте Script ElevatorController и вставьте код.
В Play встаньте НА платформу и нажмите E у нижней кнопки. Лифт перемещает стоящего на нём персонажа вместе с собой. Проверьте с двумя игроками и не используйте второй контроллер для этой же платформы.
Это пути для скриптов из блоков кода ниже. Остальные объекты создайте по инструкции.
└── ServerScriptService
└── ElevatorController (Script)2. Вставьте код
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local platform = workspace:WaitForChild("ElevatorPlatform")
local bottom = workspace:WaitForChild("CallBottom")
local top = workspace:WaitForChild("CallTop")
local startCFrame = platform.CFrame
local endCFrame = startCFrame + Vector3.new(0, top.Position.Y - bottom.Position.Y, 0)
local busy = false
local position = "bottom"
local TRAVEL_TIME = 4
local function moveTo(destination)
local origin = platform.CFrame
local elapsed = 0
while elapsed < TRAVEL_TIME do
local dt = RunService.Heartbeat:Wait()
elapsed = math.min(TRAVEL_TIME, elapsed + dt)
local alpha = elapsed / TRAVEL_TIME
alpha = alpha * alpha * (3 - 2 * alpha)
local previous = platform.CFrame
local nextFrame = origin:Lerp(destination, alpha)
-- Переносим стоящих НА платформе игроков вместе с платформой.
local riders = {}
for _, player in ipairs(Players:GetPlayers()) do
local char = player.Character
local root = char and char:FindFirstChild("HumanoidRootPart")
local humanoid = char and char:FindFirstChildOfClass("Humanoid")
if root and humanoid and humanoid.Health > 0 then
local p = previous:PointToObjectSpace(root.Position)
if math.abs(p.X) < platform.Size.X / 2 and math.abs(p.Z) < platform.Size.Z / 2
and p.Y > platform.Size.Y / 2 and p.Y < platform.Size.Y / 2 + 6 then
table.insert(riders, char)
end
end
end
platform.CFrame = nextFrame
local delta = nextFrame * previous:Inverse()
for _, char in ipairs(riders) do
if char.Parent then char:PivotTo(delta * char:GetPivot()) end
end
end
end
local function createPrompt(part, label, target)
local prompt = part:FindFirstChildOfClass("ProximityPrompt") or Instance.new("ProximityPrompt")
prompt.ActionText = label
prompt.MaxActivationDistance = 10
prompt.Parent = part
prompt.Triggered:Connect(function()
if busy or position == target then return end
busy = true
moveTo(target == "top" and endCFrame or startCFrame)
position = target
busy = false
end)
end
createPrompt(bottom, "Поднять лифт", "top")
createPrompt(top, "Опустить лифт", "bottom")3. Проверьте в игре
Нажмите Play в Roblox Studio и проверьте действие механики. Если механика не работает, откройте окно Output и проверьте тип скрипта, его расположение и названия объектов.
Когда проверите механику в Roblox Studio, отметьте практику как выполненную. Отметка хранится только в этом браузере, не в личном кабинете.
Добавляйте механики по одной и проверяйте окно Output. Не создавайте несколько одинаковых систем монет или интерфейсов; скрипты, меняющие WalkSpeed, прыжок или освещение, могут влиять друг на друга.
Измените длительность движения с 4 на 8 секунд.
Добавьте подсветку к каждой кнопке.
Сделайте двухэтажный дом с лифтом и лестницей.
4. Проверьте себя
Для чего лифту нужна кнопка вызова?
При движении Anchored платформы игрок может соскальзывать: это демо движения, а не готовый пассажирский лифт.