スタジオとスタジオを行き来するシステムで、ブロックとブロックをテレポートするのとは全く違う。
ゲームを拡張していくとゲームが重くなってしまうので、スタジオを分けてゲームを分散しよう。
ModuleScriptはReplicatedStorageの中に、
Scriptはテレポートさせたいブロックなどにつけよう。
またテレポート先のスタジオは必ずテレポート元の中に入れる必要がある。
詳しくは動画を参考にしよう。
このをModuleScriptをReplicatedStorageに入れる
ModuleScript
local TeleportService = game:GetService("TeleportService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local TeleportModule = {}
local RETRY_DELAY = 2
local MAX_WAIT = 10
-- Create remote event instance
local teleportEvent = Instance.new("RemoteEvent")
teleportEvent.Name = "TeleportEvent"
teleportEvent.Parent = ReplicatedStorage
function TeleportModule.teleportWithRetry(targetPlaceID, playersTable, teleportOptions)
local currentWait = 0
-- Show custom teleport screen to valid players if client event is connected
teleportEvent:FireAllClients(playersTable, true)
local function doTeleport(players, options)
if currentWait < MAX_WAIT then
local success, errorMessage = pcall(function()
return TeleportService:TeleportAsync(targetPlaceID, players, options)
end)
if not success then
warn(errorMessage)
-- Retry teleport after defined delay
wait(RETRY_DELAY)
currentWait = currentWait + RETRY_DELAY
doTeleport(players, teleportOptions)
end
else
-- On failure, hide custom teleport screen for remaining valid players
teleportEvent:FireAllClients(players, false)
return true
end
end
TeleportService.TeleportInitFailed:Connect(function(player, teleportResult, errorMessage)
if teleportResult ~= Enum.TeleportResult.Success then
warn(errorMessage)
-- Retry teleport after defined delay
wait(RETRY_DELAY)
currentWait = currentWait + RETRY_DELAY
doTeleport({player}, teleportOptions)
end
end)
-- Fire initial teleport
doTeleport(playersTable, teleportOptions)
end
return TeleportModule
このオブジェクトをワークスペースに入れる
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local teleportPart = script.Parent
local targetPlaceID = 0000000000(ここにテレポートしたいゲームIDを入れる)
-- Require teleport module
local TeleportModule = require(ReplicatedStorage:WaitForChild("TeleportModule"))
local function onPartTouch(otherPart)
-- Get player from character
local player = Players:GetPlayerFromCharacter(otherPart.Parent)
if player and not player:GetAttribute("Teleporting") then
player:SetAttribute("Teleporting", true)
-- Teleport the player
local teleportResult = TeleportModule.teleportWithRetry(targetPlaceID, {player})
player:SetAttribute("Teleporting", nil)
end
end
teleportPart.Touched:Connect(onPartTouch)