Как сделать телепорт в Роблокс Студио: плита, код и защита
Как сделать телепорт в Роблокс Студио: игрок наступает на плиту и мгновенно оказывается в другой точке карты. Пошагово, с готовым скриптом на Luau и защитой от повторного срабатывания.
- Событие Touched и поиск игрока
- PivotTo переносит персонажа целиком
- Защита от бесконечных телепортов
Пошагово
Сделайте две плиты
Добавьте два блока (Part). Первый назовите TeleportPad — это вход, второй TeleportTarget — выход. Поставьте их в разных местах карты. Размер, например, 6, 1, 6, чтобы на плиту было легко наступить.
Закрепите и оформите
Включите Anchored у обеих плит. Вход сделайте, например, фиолетовым с материалом Neon, чтобы игроки понимали, что это портал. Обе плиты должны лежать прямо в Workspace, а не внутри папки или модели.
Добавьте Script во вход
Наведите курсор на TeleportPad в Explorer, нажмите плюс и выберите Script. Вставьте код из первого блока ниже. Проверьте, что в строке TARGET_NAME написано точно то же имя, что у плиты-выхода, с учётом больших и маленьких букв.
Запустите и проверьте
Нажмите Play и наступите на вход. Персонаж должен появиться над плитой-выходом и мягко приземлиться на неё. Если ничего не происходит, откройте окно Output и прочитайте ошибку — чаще всего это опечатка в имени.
Сделайте телепорт в обе стороны
Поставьте рядом с каждым порталом отдельную невидимую точку выхода (Part с Transparency = 1 и выключенными CanCollide и CanTouch). Скопируйте Script во второй портал и укажите в TARGET_NAME точку возле первого. Общая пауза защитит от «пинг-понга».
Скрипт
-- Телепорт: игрок наступает на эту плиту и переносится к плите-выходу
local Players = game:GetService("Players")
local pad = script.Parent -- плита-вход (скрипт лежит внутри неё)
local TARGET_NAME = "TeleportTarget" -- точное имя плиты-выхода в Workspace
local COOLDOWN = 2 -- пауза в секундах между телепортами одного игрока
local target = workspace:WaitForChild(TARGET_NAME)
local function onTouched(hit)
-- hit — часть, которая коснулась плиты (нога, рука, шапка...)
local character = hit.Parent
if not character then
return
end
-- Проверяем, что это живой персонаж, а не мяч или другой блок
local humanoid = character:FindFirstChildOfClass("Humanoid")
if not humanoid or humanoid.Health <= 0 then
return
end
-- Находим игрока по персонажу (у NPC игрока нет — их не трогаем)
local player = Players:GetPlayerFromCharacter(character)
if not player then
return
end
-- Debounce: если игрок только что телепортировался — ничего не делаем
if player:GetAttribute("JustTeleported") then
return
end
player:SetAttribute("JustTeleported", true)
-- PivotTo переносит всю модель персонажа целиком, со всеми частями.
-- Ставим его чуть выше верхней грани цели, чтобы он не застрял в плите.
local landing = target.CFrame * CFrame.new(0, target.Size.Y / 2 + 4, 0)
character:PivotTo(landing)
-- Через COOLDOWN секунд снимаем пометку — телепорт снова доступен
task.delay(COOLDOWN, function()
if player.Parent then -- игрок ещё в игре
player:SetAttribute("JustTeleported", nil)
end
end)
end
pad.Touched:Connect(onTouched)
-- Вариант: телепорт по клавише E. Положите в плиту ProximityPrompt и этот Script
local pad = script.Parent
local prompt = pad:WaitForChild("ProximityPrompt")
local target = workspace:WaitForChild("TeleportTarget")
prompt.ActionText = "Телепорт"
prompt.ObjectText = "Портал"
-- Triggered сам передаёт игрока, который нажал E, поэтому искать его не нужно
prompt.Triggered:Connect(function(player)
local character = player.Character
local humanoid = character and character:FindFirstChildOfClass("Humanoid")
if not humanoid or humanoid.Health <= 0 then
return -- персонажа нет или он погиб
end
character:PivotTo(target.CFrame * CFrame.new(0, target.Size.Y / 2 + 4, 0))
end)
Не работает? Частые ошибки
Плита-выход не закреплена (Anchored) или у неё выключен CanCollide. Включите оба свойства. Если персонаж всё равно застревает, увеличьте запас по высоте в строке с landing: вместо + 4 поставьте + 6.
Персонаж приземляется прямо на второй портал. Ставьте точку выхода рядом с порталом, а не на нём, и оставьте общую паузу через атрибут JustTeleported — она работает сразу для всех порталов.
Скорее всего, в коде меняется Position отдельной части. Двигайте всю модель персонажа через character:PivotTo(...), как в нашем скрипте, — это основной способ перемещать модели в Roblox.
Скрипт не нашёл плиту-выход. Проверьте имя в TARGET_NAME и то, что плита лежит прямо в Workspace, а не в папке. Если она в папке, напишите путь: workspace.Portals:WaitForChild(TARGET_NAME).
Как сделать телепорт в Роблокс Студио: разбор скрипта
Разобраться, как сделать телепорт в Роблокс Студио, стоит одним из первых: в этой механике сразу несколько важных идей.
- Событие Touched. Срабатывает, когда что-то касается плиты, и передаёт в функцию часть, которая коснулась, — например, ногу персонажа. Её родитель (hit.Parent) — это модель персонажа.
- Проверка Humanoid. Плиты касаются не только игроки: мячи, ящики, другие блоки. Если в модели нет Humanoid или здоровье равно нулю, выходим из функции.
- GetPlayerFromCharacter. Находит игрока по модели персонажа. У NPC игрока нет, их телепорт не трогает.
- PivotTo. Переносит всю модель вместе со всеми частями. Это рекомендуемый способ двигать модели скриптом.
- Debounce через атрибут. Touched срабатывает много раз подряд — каждая нога, каждая рука. Атрибут JustTeleported на игроке говорит: «уже телепортирован, подожди пару секунд».
Почему пауза хранится на игроке, а не в скрипте
Можно было бы хранить паузу в обычной переменной внутри скрипта. Но тогда у каждого портала своя пауза, и если выход одного портала совпадает со входом другого, игрока начнёт бросать туда-обратно: второй портал не знает, что игрок только что прилетел.
Атрибут — это метка, которая хранится прямо на объекте игрока. Её видят все скрипты в игре, поэтому один раз поставленная метка JustTeleported защищает сразу от всех порталов. Через две секунды task.delay снимает её, и телепорт снова работает.
Проверка if player.Parent внутри task.delay нужна на случай, если игрок вышел из игры за эти две секунды. Такие мелочи и отличают код, который «работает у меня», от кода, который работает у всех. Похожий приём защиты от повторов есть и в туториале как сделать дверь в Роблокс Студио.
Идеи для своих телепортов
- Телепорт по клавише E. Второй скрипт выше использует ProximityPrompt: игрок сам решает, когда перенестись. Удобно для лифтов и дверей между комнатами.
- Чекпоинты в обби. Запоминайте последнюю плиту, которой коснулся игрок, и переносите его туда после падения.
- Случайный телепорт. Положите несколько точек выхода в папку и выбирайте одну через math.random.
- Платный портал. Пропускайте только игроков, у которых хватает монет, — как устроены монеты, показываем в туториале про магазин в Роблокс Студио.
Обратите внимание: здесь мы разбираем, как сделать телепорт в Роблокс Студио внутри одного места (Place). Перенос в другую игру или другое место делается через TeleportService — это отдельная тема и следующий уровень. Общий план создания игры — в гайде как сделать игру в Роблокс.
Заметка для родителей
Туториал рассчитан на детей 10–16 лет. На первый взгляд телепорт — это просто «наступил и перенёсся», но в скрипте ребёнок встречает события, проверки условий, работу с объектами и защиту от ошибок. Те же идеи потом понадобятся в Python и любом другом языке.
Хороший вопрос после урока: «Что будет, если убрать проверку Humanoid?» Если ребёнок отвечает, что скрипт сломается, когда плиты коснётся мяч или блок, — он понял логику, а не просто скопировал код. Если отвечает «не знаю», это нормально: именно на таких вопросах и строится обучение с наставником.
Когда ребёнок понял, как сделать телепорт в Роблокс Студио, предложите ему усложнить задачу: добавить второй портал, чекпоинты или случайную точку выхода.
Хотите, чтобы ребёнок делал целые игры?
Телепорт — одна механика из десятков, из которых состоит настоящая игра. На уроках в Excklusive-IT ребёнок собирает игру целиком вместе с наставником 1-на-1: 60 минут в Zoom, на русском, украинском или английском, в удобное время в вашем часовом поясе. Наставник весь курс один и тот же, поэтому он помнит проекты ребёнка и подбирает следующую механику под его игру.
Подросткам 14–17 лет подходит программа Roblox + AI: 4 урока в месяц по 120 минут, на первом из них за одну сессию собирается полноценный шутер, а дальше — 3D-модели, анимации и эффекты с помощью AI-инструментов. Хотите, чтобы ребёнок делал целые игры вроде этой? Первый урок 1-на-1 — бесплатно. Подробнее — на странице курса Roblox.
Вопросы, которые задают родители
Почему телепорт срабатывает много раз подряд?
Событие Touched срабатывает на каждую часть тела, которая коснулась плиты, — ноги, руки, аксессуары. Без защиты игрок телепортируется десятки раз. Поэтому в скрипте есть пауза: атрибут JustTeleported не даёт телепортировать того же игрока снова в течение двух секунд.
Можно ли телепортировать в другую игру?
Да, но это другой механизм — TeleportService. Он переносит игрока в другое место (Place) или в другую игру и работает только в опубликованной игре, а не в обычном тесте Studio. Наш туториал про перемещение внутри одной карты.
Почему используется PivotTo, а не Position?
PivotTo переносит всю модель персонажа целиком со всеми частями и сохраняет связи между ними. Если менять Position одной части, можно сдвинуть только её. В документации Roblox PivotTo указан как основной способ перемещать модели скриптом.
Будет ли телепорт работать на телефоне?
Да. Скрипт реагирует на касание плиты персонажем, а это одинаково работает на компьютере, телефоне, планшете и консоли. Вариант с клавишей E тоже работает везде: на телефоне подсказку ProximityPrompt можно просто нажать пальцем.
Как телепортировать NPC?
В нашем скрипте NPC пропускаются проверкой GetPlayerFromCharacter. Если нужно телепортировать и их, уберите эту проверку, а паузу храните как атрибут на самой модели персонажа, а не на игроке: character:SetAttribute("JustTeleported", true).
Бесплатный урок Roblox с наставником
Покажем, как из отдельных механик собрать настоящую игру. 60 минут 1-на-1 в Roblox Studio, онлайн на русском, в удобное время. Без оплаты.
Записаться на бесплатный урокЗапишитесь на бесплатный урок
Без обязательств. Без оплаты. Просто первый урок для вашего ребёнка.
Или напишите нам напрямую
Нажмите на мессенджер — чат откроется с готовым приветствием.
- +1 (289) 44-28-698
- excklusiveit@gmail.com
-
Часы работы — Гамильтон, Онтарио (ET) Пн–Пт: 9:00–18:00 Сб–Вс: 8:00–16:00
- Онлайн по всему миру · класс в Гамильтоне: 170 Parkdale Ave N, Hamilton, ON L8H 5X2