Туториал Roblox Studio · Luau

Как сделать телепорт в Роблокс Студио: плита, код и защита

Как сделать телепорт в Роблокс Студио: игрок наступает на плиту и мгновенно оказывается в другой точке карты. Пошагово, с готовым скриптом на Luau и защитой от повторного срабатывания.

  • Событие Touched и поиск игрока
  • PivotTo переносит персонажа целиком
  • Защита от бесконечных телепортов

Пошагово

  1. Сделайте две плиты

    Добавьте два блока (Part). Первый назовите TeleportPad — это вход, второй TeleportTarget — выход. Поставьте их в разных местах карты. Размер, например, 6, 1, 6, чтобы на плиту было легко наступить.

  2. Закрепите и оформите

    Включите Anchored у обеих плит. Вход сделайте, например, фиолетовым с материалом Neon, чтобы игроки понимали, что это портал. Обе плиты должны лежать прямо в Workspace, а не внутри папки или модели.

  3. Добавьте Script во вход

    Наведите курсор на TeleportPad в Explorer, нажмите плюс и выберите Script. Вставьте код из первого блока ниже. Проверьте, что в строке TARGET_NAME написано точно то же имя, что у плиты-выхода, с учётом больших и маленьких букв.

  4. Запустите и проверьте

    Нажмите Play и наступите на вход. Персонаж должен появиться над плитой-выходом и мягко приземлиться на неё. Если ничего не происходит, откройте окно Output и прочитайте ошибку — чаще всего это опечатка в имени.

  5. Сделайте телепорт в обе стороны

    Поставьте рядом с каждым порталом отдельную невидимую точку выхода (Part с Transparency = 1 и выключенными CanCollide и CanTouch). Скопируйте Script во второй портал и укажите в TARGET_NAME точку возле первого. Общая пауза защитит от «пинг-понга».

Скрипт

Script — положите внутрь плиты TeleportPad
-- Телепорт: игрок наступает на эту плиту и переносится к плите-выходу
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 — Script и ProximityPrompt внутри плиты
-- Вариант: телепорт по клавише 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.

В Output ошибка Infinite yield possible on Workspace:WaitForChild("TeleportTarget")

Скрипт не нашёл плиту-выход. Проверьте имя в 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, онлайн на русском, в удобное время. Без оплаты.

Записаться на бесплатный урок

Запишитесь на бесплатный урок

Гарантия возврата денег Не подошло? Вернём деньги за неиспользованные уроки в течение 14 дней.
CA$70 за индивидуальный урок 60 мин ≈ US$50. Крупные школы США берут US$60–75 за 50–60 минут.
Один наставник, вживую, 1-на-1 На русском, украинском или английском. Проверка Vulnerable Sector Check. Родители могут присутствовать.