{}const=>[]async()letfn</>var
LuaПрактикаОсновы

Как сделать телепорт в Roblox Studio: между точками и places

Соберём телепорт внутри одной карты и переход между places. Вставьте готовый Luau-код, настройте точки и проверьте частые ошибки без цикла касаний.

К

Кодик

Автор

6 мин чтения

Для телепорта внутри одной карты переместите модель персонажа через character:PivotTo(). Для перехода в другой place вызывайте TeleportService:TeleportAsync() из обычного серверного Script. Ниже два готовых варианта: портал по касанию, защита от повторного запуска и проверка ошибок.

Словом «телепорт» в Roblox называют две разные механики. Первая мгновенно переносит игрока к другой детали в том же мире. Вторая отключает его от текущего сервера и загружает другой place. Если выбрать не тот метод, код либо усложнится, либо вообще не запустится.

1Создаём вход

Деталь TeleportPad ловит касание персонажа через событие Touched.

2Находим игрока

Скрипт поднимается от детали тела к Model и проверяет её через Players.

3Выбираем переход

PivotTo двигает персонажа, TeleportAsync отправляет его в другой place.

Какой телепорт нужен: внутри карты или между places

В Roblox experience может состоять из нескольких places. Один place содержит свою карту и запускается на отдельном сервере. Поэтому переход в соседнюю комнату и загрузка другого place технически устроены по-разному.

ЗадачаМетодГде работает кодКак проверить
Другая точка той же картыcharacter:PivotTo()Обычный Script внутри порталаPlay в Roblox Studio
Другой place в experienceTeleportService:TeleportAsync()Только серверный ScriptОпубликованная игра в приложении Roblox
Кнопка в интерфейсеRemoteEvent плюс один из методов вышеLocalScript отправляет запрос, Script проверяет егоЗависит от выбранного перехода
Правило выбора

Если экран загрузки не нужен и обе точки видны в Workspace, используйте PivotTo. Если загружается отдельный place, нужен TeleportService.

Сравнение телепорта внутри карты через PivotTo и перехода между places через TeleportService
Один place сохраняет текущий сервер, переход между places запускает загрузку другого сервера.

🔥 100 000+ учеников уже с нами

Устал читать теорию?
Пора кодить!

Кодик — приложение, где ты учишься программировать через практику. AI-наставник, интерактивные уроки, реальные проекты.

🤖 AI 24/7
🎓 Сертификаты
💰 Бесплатно
🚀 Начать учиться
Присоединились сегодня

Телепорт между двумя точками одной карты

Соберём площадку, которая переносит персонажа к невидимой точке. Скрипт будет серверным, поэтому новое положение увидят все игроки. Такой вариант подходит для дверей, лифтов, порталов и чекпоинтов без загрузочного экрана.

Подготовьте две детали
  1. Добавьте в Workspace деталь и назовите её TeleportPad. Поставьте Anchored = true и оставьте CanTouch = true.
  2. Добавьте вторую деталь TeleportTarget в точку прибытия. Для метки задайте Anchored = true, CanCollide = false, CanTouch = false и Transparency = 1.
  3. Внутрь TeleportPad вставьте обычный Script. Не LocalScript.
  4. Вставьте код ниже и нажмите 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 блокирует повторные события на одну секунду.

Схема обработки касания портала от события Touched до вызова PivotTo
Проверка Player отсекает случайные детали, а cooldown не даёт одному касанию запустить телепорт несколько раз.

Этап пройден. В окне Output нет красных строк, персонаж переносится один раз и появляется над точкой, а не внутри неё.

Как устроен код с 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().

Подготовьте переход между places
  1. Добавьте второй place в тот же experience и опубликуйте оба places.
  2. Скопируйте числовой Place ID страницы назначения в Creator Hub. Это не Universe ID.
  3. Создайте в исходном place деталь Portal, включите Anchored и вставьте внутрь серверный Script.
  4. Замените число в 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 ловит случай, когда запуск прошёл, но переход сорвался позднее. В обоих случаях блокировка снимается, и игрок может попробовать снова.

Схема перехода игрока с исходного сервера в другой place через TeleportService
TeleportAsync запускается на исходном сервере, а успешный переход заканчивается подключением к серверу нужного place.

Почему телепорт не работает

Сначала откройте View, Output и повторите переход. Первая красная строка обычно сразу показывает, чего не хватает: объекта, правильного ID или серверного контекста. Не меняйте пять вещей одновременно. Исправьте одну причину и запустите тест снова.

Infinite yield possible

В Workspace нет детали с точным именем TeleportTarget. Проверьте регистр букв и расположение объекта.

Игрок дёргается туда-сюда

Точка прибытия касается второго активного портала. Отнесите метку в сторону и выключите у неё CanTouch.

Teleport failed

Проверяется Studio-тест, вставлен Universe ID или place не опубликован. Сверьте ID и зайдите через приложение Roblox.

Мини-проверка перед публикацией игры. Оба places опубликованы, 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 уже с понятной задачей.

🎯Хватит откладывать

Понравилась статья?
Пора применять на практике!

В Кодик ты не просто читаешь — ты сразу пишешь код. Теория + практика = реальный скилл.

Мгновенная практика
🧠AI объяснит код
🏆Сертификат

Без регистрации • Без карты