Для телепорта внутри одной карты переместите модель персонажа через character:PivotTo(). Для перехода в другой place вызывайте TeleportService:TeleportAsync() из обычного серверного Script. Ниже два готовых варианта: портал по касанию, защита от повторного запуска и проверка ошибок.
Словом «телепорт» в Roblox называют две разные механики. Первая мгновенно переносит игрока к другой детали в том же мире. Вторая отключает его от текущего сервера и загружает другой place. Если выбрать не тот метод, код либо усложнится, либо вообще не запустится.
Деталь TeleportPad ловит касание персонажа через событие Touched.
Скрипт поднимается от детали тела к Model и проверяет её через Players.
PivotTo двигает персонажа, TeleportAsync отправляет его в другой place.
Какой телепорт нужен: внутри карты или между places
В Roblox experience может состоять из нескольких places. Один place содержит свою карту и запускается на отдельном сервере. Поэтому переход в соседнюю комнату и загрузка другого place технически устроены по-разному.
| Задача | Метод | Где работает код | Как проверить |
|---|---|---|---|
| Другая точка той же карты | character:PivotTo() | Обычный Script внутри портала | Play в Roblox Studio |
| Другой place в experience | TeleportService:TeleportAsync() | Только серверный Script | Опубликованная игра в приложении Roblox |
| Кнопка в интерфейсе | RemoteEvent плюс один из методов выше | LocalScript отправляет запрос, Script проверяет его | Зависит от выбранного перехода |
Если экран загрузки не нужен и обе точки видны в Workspace, используйте PivotTo. Если загружается отдельный place, нужен TeleportService.

Один place сохраняет текущий сервер, переход между places запускает загрузку другого сервера.
Телепорт между двумя точками одной карты
Соберём площадку, которая переносит персонажа к невидимой точке. Скрипт будет серверным, поэтому новое положение увидят все игроки. Такой вариант подходит для дверей, лифтов, порталов и чекпоинтов без загрузочного экрана.
- Добавьте в
Workspaceдеталь и назовите еёTeleportPad. ПоставьтеAnchored = trueи оставьтеCanTouch = true. - Добавьте вторую деталь
TeleportTargetв точку прибытия. Для метки задайтеAnchored = true,CanCollide = false,CanTouch = falseиTransparency = 1. - Внутрь
TeleportPadвставьте обычныйScript. Не LocalScript. - Вставьте код ниже и нажмите Play. Наступите на площадку персонажем.
local Players = game:GetService("Players")
local teleportPad = script.Parent
local target = workspace:WaitForChild("TeleportTarget")
local cooldown = {}
local function onTouched(otherPart)
local character = otherPart:FindFirstAncestorOfClass("Model")
if not character then
return
end
local player = Players:GetPlayerFromCharacter(character)
if not player or cooldown[player] then
return
end
cooldown[player] = true
character:PivotTo(target.CFrame * CFrame.new(0, 3, 0))
task.delay(1, function()
cooldown[player] = nil
end)
end
teleportPad.Touched:Connect(onTouched)
Players.PlayerRemoving:Connect(function(player)
cooldown[player] = nil
end)- При касании персонаж появляется на 3 studs выше
TeleportTargetи не застревает в полу. - Касание аксессуаром тоже распознаётся, потому что код ищет ближайшую модель персонажа.
- Таблица
cooldownблокирует повторные события на одну секунду.

Проверка Player отсекает случайные детали, а cooldown не даёт одному касанию запустить телепорт несколько раз.
Как устроен код с PivotTo
Событие Touched передаёт деталь, которая коснулась площадки. Это может быть нога, рука или аксессуар, поэтому проверка только otherPart.Parent иногда промахивается. FindFirstAncestorOfClass("Model") надёжнее находит всю модель персонажа.
Players:GetPlayerFromCharacter(character)подтверждает, что модель принадлежит настоящему игроку, а не NPC или упавшему предмету.target.CFrame * CFrame.new(0, 3, 0)берёт положение цели и добавляет три studs вверх.character:PivotTo(...)переносит модель целиком. Не нужно отдельно двигать голову, корпус и ноги.- Ключ
cooldown[player]хранится отдельно для каждого игрока, поэтому два человека могут войти в портал почти одновременно.
Если таблицы, функции и условия пока читаются как набор знаков, сначала разберите их на коротких упражнениях в бесплатном курсе Lua. После этого код портала проще менять под свою игру, а не копировать вслепую.
Телепорт в другой place через TeleportService
Для другого place перемещения модели недостаточно. Roblox должен найти сервер назначения, отключить игрока от текущего сервера и загрузить новую карту. Этим занимается TeleportService. Метод TeleportAsync() вызывают на сервере, а сетевой вызов оборачивают в pcall().
- Добавьте второй place в тот же experience и опубликуйте оба places.
- Скопируйте числовой Place ID страницы назначения в Creator Hub. Это не Universe ID.
- Создайте в исходном place деталь
Portal, включитеAnchoredи вставьте внутрь серверныйScript. - Замените число в
TARGET_PLACE_ID, опубликуйте изменения и войдите в игру через приложение Roblox. Обычный Play Test Studio для TeleportService не подходит.
local Players = game:GetService("Players")
local TeleportService = game:GetService("TeleportService")
local portal = script.Parent
local TARGET_PLACE_ID = 1234567890
local busy = {}
local function onTouched(otherPart)
local character = otherPart:FindFirstAncestorOfClass("Model")
local player = character and Players:GetPlayerFromCharacter(character)
if not player or busy[player] then
return
end
busy[player] = true
local success, result = pcall(function()
return TeleportService:TeleportAsync(TARGET_PLACE_ID, { player })
end)
if not success then
warn(("Teleport failed for %s: %s"):format(player.Name, tostring(result)))
busy[player] = nil
end
end
TeleportService.TeleportInitFailed:Connect(function(player, teleportResult, errorMessage, placeId)
if placeId == TARGET_PLACE_ID then
busy[player] = nil
warn(("TeleportInitFailed for %s: %s, %s"):format(
player.Name,
teleportResult.Name,
errorMessage
))
end
end)
portal.Touched:Connect(onTouched)
Players.PlayerRemoving:Connect(function(player)
busy[player] = nil
end)pcall() ловит ошибку самого вызова. Событие TeleportInitFailed ловит случай, когда запуск прошёл, но переход сорвался позднее. В обоих случаях блокировка снимается, и игрок может попробовать снова.

TeleportAsync запускается на исходном сервере, а успешный переход заканчивается подключением к серверу нужного place.
Почему телепорт не работает
Сначала откройте View, Output и повторите переход. Первая красная строка обычно сразу показывает, чего не хватает: объекта, правильного ID или серверного контекста. Не меняйте пять вещей одновременно. Исправьте одну причину и запустите тест снова.
В Workspace нет детали с точным именем TeleportTarget. Проверьте регистр букв и расположение объекта.
Точка прибытия касается второго активного портала. Отнесите метку в сторону и выключите у неё CanTouch.
Проверяется Studio-тест, вставлен Universe ID или place не опубликован. Сверьте ID и зайдите через приложение Roblox.
TARGET_PLACE_ID ведёт на место назначения, код лежит в Script, ошибки попадают в Output, а повторное касание не создаёт цикл.Как сделать телепорт в Roblox Studio по касанию?
Телепорт по касанию делают серверным Script внутри детали. Script слушает BasePart.Touched, находит игрока и вызывает character:PivotTo(target.CFrame).
Почему телепорт в Roblox срабатывает несколько раз?
Телепорт срабатывает несколько раз, потому что площадки касаются разные части одного персонажа. Добавьте таблицу cooldown по объекту Player и снимайте блокировку через task.delay().
Чем PivotTo отличается от TeleportService?
PivotTo() перемещает модель внутри текущего place. TeleportService:TeleportAsync() загружает другой place или сервер и вызывается из серверного Script.
Можно ли проверить TeleportService в Roblox Studio?
TeleportService нельзя полноценно проверить обычным Play Test в Roblox Studio. Experience нужно опубликовать, а переход запустить из приложения Roblox.
Где взять Place ID для TeleportAsync?
Place ID берут из страницы конкретного place в Creator Hub. Нужен числовой ID места назначения, не Universe ID всего experience.
Если это ваш первый интерактивный объект, разберите первый скрипт Roblox с реакцией на игрока. Для кнопки на экране пригодится связка RemoteEvent между клиентом и сервером. Красные строки из Output собраны в разборе ошибок Roblox Studio.
Полный маршрут от синтаксиса до своей механики есть в дорожной карте Lua-разработчика для Roblox. В Кодике можно бесплатно закрепить Lua на коротких упражнениях, запустить код прямо с телефона и вернуться в Studio уже с понятной задачей.
