Движущаяся платформа
Платформа автоматически ездит туда и обратно.
Платформа плавно движется на 18 студов по оси X и возвращается. Игрока может понадобиться сопровождать движением: TweenService не гарантирует перенос стоящего персонажа.
1. Подготовьте объект
Где разместить: Script внутри движущегося Part
Создайте Part MovingPlatform (Anchored = true, CanCollide = true, CanTouch = true), размером примерно 12 × 1 × 12 studs. Добавьте внутрь обычный Script и вставьте код.
В Play встаньте на платформу: она перенесёт персонажа на 18 studs и вернётся назад. Проверьте с двумя игроками в Test → Start.
Платформа должна иметь свободный путь без стен. Это учебный вариант для простой плоской платформы: в сложных играх лучше использовать модель лифта с отдельной системой перевозки.
2. Вставьте код
-- Script внутри MovingPlatform (Part)
-- Платформа движется вправо и обратно и переносит стоящих на ней игроков.
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local platform = script.Parent
local DISTANCE = 18
local MOVE_TIME = 3
local PAUSE = 0.5
local start = platform.CFrame
local finish = start * CFrame.new(DISTANCE, 0, 0)
local function ridersAt(frame)
local riders = {}
local params = RaycastParams.new()
params.FilterType = Enum.RaycastFilterType.Include
params.FilterDescendantsInstances = {platform}
for _, player in ipairs(Players:GetPlayers()) do
local character = player.Character
local root = character and character:FindFirstChild("HumanoidRootPart")
local humanoid = character and character:FindFirstChildOfClass("Humanoid")
if root and humanoid and humanoid.Health > 0 then
-- Луч вниз проверяет, что персонаж действительно стоит на платформе.
local hit = workspace:Raycast(root.Position, Vector3.new(0, -7, 0), params)
if hit and hit.Instance == platform then
riders[#riders + 1] = character
end
end
end
return riders
end
local function travel(from, to)
local elapsed = 0
while elapsed < MOVE_TIME do
elapsed = math.min(MOVE_TIME, elapsed + RunService.Heartbeat:Wait())
local t = elapsed / MOVE_TIME
local eased = t * t * (3 - 2 * t)
local previous = platform.CFrame
local passengers = ridersAt(previous)
local nextFrame = from:Lerp(to, eased)
platform.CFrame = nextFrame
local delta = nextFrame * previous:Inverse()
for _, character in ipairs(passengers) do
if character.Parent then
character:PivotTo(delta * character:GetPivot())
end
end
end
end
while platform.Parent do
travel(start, finish)
task.wait(PAUSE)
travel(finish, start)
task.wait(PAUSE)
end3. Проверьте в игре
Нажмите Play в Roblox Studio и проверьте действие механики. Если механика не работает, откройте окно Output и проверьте тип скрипта, его расположение и названия объектов.
Когда проверите механику в Roblox Studio, отметьте практику как выполненную. Отметка хранится только в этом браузере, не в личном кабинете.
Добавляйте механики по одной и проверяйте окно Output. Не создавайте несколько одинаковых систем монет или интерфейсов; скрипты, меняющие WalkSpeed, прыжок или освещение, могут влиять друг на друга.
Измените DISTANCE и MOVE_TIME. Попробуйте двигать платформу вдоль оси Z.
Измените внешний вид игрового объекта и добавьте рядом второй экземпляр с другими настройками.
Придумайте мини-уровень, в котором эта механика помогает игроку достичь цели.
4. Проверьте себя
Что нужно включить у платформы, чтобы она не падала от гравитации?
Если персонаж соскальзывает, увеличьте площадь платформы и убедитесь, что CanCollide = true, Anchored = true. Не ставьте на одну платформу два скрипта движения. Скрипт переносит только игроков, находящихся над платформой; NPC и свободные предметы он не перевозит.