体験申込で

Amazonギフト

カードもらえる

体験申込・無料相談

News

お知らせ

ロブロックススタジオでテレポートを実装する3つの方法【スクリプト解説】

コラム

Roblox Studio(ロブロックススタジオ)で自分のゲームを作っていて、「プレイヤーを一瞬で別の場所に移動させたい」「別のゲームに送りたい」と思ったことはありませんか。

ドアを開けて別室に歩かせるだけでは物足りない、そんな場面で使うのがテレポートです。ただ、Robloxのテレポートには複数のやり方があり、「どれを使えばいいのか」「なぜコードを書いても動かないのか」でつまずく人が少なくありません。

この記事では、同じゲーム内での座標移動・ProximityPromptを使った接触型・別のゲームへのTeleportServiceの3パターンを、コピペで動くLuauコード付きで解説します。さらに、テレポートが動かないときにまず疑うべきポイントも合わせて紹介するので、初めてスクリプトに触れる方でも迷わず実装できます。

Roblox公式のCreator Hub(create.roblox.com/docs)が公開しているTeleportServiceのリファレンスをもとにしているので、情報の古さを気にせず読み進められます。

ロブロックススタジオのテレポートとは

テレポートとは、プレイヤーのキャラクターを歩かせずに別の座標や別のゲームへ瞬間移動させる仕組みです。Roblox Studioでは、目的によって使うべき方法が変わります。

  • 同じマップの中で移動させたいだけなら、座標(CFrame)を書き換えるだけで実現できる
  • プレイヤーがドアやワープゾーンに触れたときだけ発動させたいなら、ProximityPromptと組み合わせる
  • 別のゲーム(プレース)へ送りたいなら、Roblox公式のTeleportServiceを使う

3つとも「テレポート」と呼ばれますが、使うAPIも書き方もまったく別物です。次の章から、それぞれの実装コードを順番に見ていきます。

【パターン①】同じゲーム内で座標移動するテレポート

同じゲーム内であれば、キャラクターの座標を直接書き換えるだけでテレポートが完成します。3つのパターンの中で、もっとも実装が簡単な方法です。

CFrameを使ったスクリプト例

ワークスペースに移動先の目印となるPart(名前を「TeleportPoint」とする)を置いておき、以下のスクリプトをServerScriptServiceに追加します。

local Players = game:GetService("Players")

local function teleportToPoint(player)
	local character = player.Character
	if not character then
		return
	end

	local humanoidRootPart = character:FindFirstChild("HumanoidRootPart")
	local targetPoint = workspace:FindFirstChild("TeleportPoint")

	if humanoidRootPart and targetPoint then
		humanoidRootPart.CFrame = targetPoint.CFrame + Vector3.new(0, 3, 0)
	end
end

-- 動作確認用ゲーム参加5秒後にテレポートさせる
Players.PlayerAdded:Connect(function(player)
	task.wait(5)
	teleportToPoint(player)
end)

Vector3.new(0, 3, 0)を足しているのは、目印パーツにめり込まず少し上に着地させるためです。この値を省略すると、キャラクターがパーツの中に埋まってしまうことがあります。

うまく動かないときの確認ポイント

このパターンで動かない場合、原因の大半は次の2つです。

  1. 「TeleportPoint」という名前のパーツがワークスペースに存在しない、またはスペルが違う
  2. キャラクターがまだ読み込まれていないタイミングでスクリプトを実行している

character:FindFirstChildの結果を必ずnilチェックしてから使うのが、エラーを防ぐ基本です。

Roblox StudioでCFrameを使い座標を書き換えてテレポートする仕組みを示す図解

【パターン②】ProximityPromptでブロックに触れるとテレポート

「特定の場所に近づいてボタンを押したらワープする」という、ゲームらしい演出を作りたいときはProximityPromptを使います。

必要なオブジェクトの配置手順

  1. ワークスペースにテレポートの入口となるPartを配置する(名前を「TeleportGate」とする)
  2. 「TeleportGate」を右クリックし、「Insert Object」から「ProximityPrompt」を追加する
  3. ProximityPromptのプロパティで、ActionText(例:「テレポートする」)を設定する
  4. 移動先の目印となるPart(「TeleportPoint」)を別の場所に配置する

スクリプトの書き方

ProximityPromptにはTriggeredイベントがあり、プレイヤーがボタンを押した瞬間に発火します。

local gate = workspace:WaitForChild("TeleportGate")
local prompt = gate:WaitForChild("ProximityPrompt")
local targetPoint = workspace:WaitForChild("TeleportPoint")

prompt.Triggered:Connect(function(player)
	local character = player.Character
	if not character then
		return
	end

	local humanoidRootPart = character:FindFirstChild("HumanoidRootPart")
	if humanoidRootPart then
		humanoidRootPart.CFrame = targetPoint.CFrame + Vector3.new(0, 3, 0)
	end
end)

WaitForChildを使うと、オブジェクトの読み込みを待ってから処理を進められます。ゲーム開始直後にFindFirstChildでnilが返ってエラーになる、というよくある失敗を避けられます。

 

 

【パターン③】別のゲーム(プレース)へのテレポート

自分の作った別のゲーム(プレース)にプレイヤーを送りたい場合は、Roblox公式のTeleportServiceを使います。3パターンの中で唯一、Roblox側のサーバーをまたぐ処理です。

TeleportServiceの基本的な使い方

local TeleportService = game:GetService("TeleportService")
local Players = game:GetService("Players")

local destinationPlaceId = 1234567890 -- 移動先のPlaceIdに置き換える

local function teleportPlayer(player)
	local success, errorMessage = pcall(function()
		TeleportService:Teleport(destinationPlaceId, player)
	end)

	if not success then
		warn("テレポートに失敗しました: " .. tostring(errorMessage))
	end
end

pcallで囲んでいるのは、通信エラーが起きたときにゲーム全体が止まらないようにするためです。TeleportServiceはRobloxのサーバー間通信を伴うため、通常のローカル処理よりも失敗する可能性が高い点を覚えておきましょう。

SafeTeleportで安全に実装する方法

公式APIそのものにはリトライ機能がないため、失敗時に自動で再試行する関数を自作するのがコミュニティでよく使われる方法です。

local function safeTeleport(placeId, player, maxRetries)
	maxRetries = maxRetries or 3

	for attempt = 1, maxRetries do
		local success = pcall(function()
			TeleportService:Teleport(placeId, player)
		end)

		if success then
			return true
		end

		task.wait(1)
	end

	warn(player.Name .. "のテレポートに" .. maxRetries .. "回失敗しました")
	return false
end

一度の失敗で諦めず、数回リトライを挟むだけで体感の成功率は大きく変わります。複数人を同時に送りたい場合は、TeleportService:TeleportAsync(placeId, players)のように第2引数へPlayerの配列を渡すと、パーティ全員をまとめて同じプレースに送れます。

PlaceIDの確認方法

移動先のPlaceIdは、Roblox Creator Dashboard(create.roblox.com)で該当のエクスペリエンスを開き、「エクスペリエンスの設定」の中に表示されるIDから確認できます。自分の別のゲームに送りたい場合は、事前にこの数字を控えておいてください。

Roblox Creator DashboardでPlaceIdを確認する設定画面のイメージイラスト

3パターンの違いを比較

どの方法を選べばいいか迷ったときは、以下の比較を参考にしてください。

パターン 使うAPI おすすめの場面
①座標移動 CFrame 同じマップ内でワープゾーンを作りたいとき
②ProximityPrompt ProximityPrompt + CFrame プレイヤーの操作で発動する演出を作りたいとき
③TeleportService TeleportService 自分の作った別のゲームへ送りたいとき

同じマップ内の移動で悩んでいるなら①か②で十分です。③が必要になるのは、複数のプレースを組み合わせた大きめのゲームを作るときだけと考えて問題ありません。

テレポートが動かないときの原因と対処法

コードの書き方は合っているのに動かない、という相談で特に多いのが次の2つです。

Playtest中は動作しない(公開後のみ有効)

TeleportServiceは、Studioの「Play」ボタンで行うPlaytest中には動作しません。これはRoblox公式のリファレンスにも明記されている仕様で、バグではありません。

動作を確認したい場合は、一度ゲームを公開(Publish)し、実際のRobloxアプリまたはブラウザ版でテストする必要があります。パターン①・②はPlaytest中でも動きますが、パターン③だけはこの制限を必ず覚えておいてください。

その他よくあるエラー

エラー・症状 原因 対処法
attempt to index nil value 目印となるPartの名前が間違っている、または存在しない ワークスペースの名前とスクリプト内の名前を完全に一致させる
ProximityPromptが表示されない ProximityPromptのMaxActivationDistanceが短すぎる プロパティの数値を大きくして距離を調整する
TeleportServiceでエラーが出ず何も起きない Studio上でPlaytestしている ゲームを公開してから実機で確認する
複数人のテレポートで一部だけ移動しない TeleportAsyncに渡すPlayerの配列にnilが含まれている 配列を作る前にプレイヤーがゲーム内に存在するか確認する

よくある質問(FAQ)

Q1. Roblox Studioでテレポートがうまく動かないのはなぜですか?

スタジオのPlaytest(再生)中はTeleportServiceが動作しないためです。公開後にRobloxアプリまたはブラウザ版でテストしてください。同じゲーム内の座標移動(CFrame)は、Playtest中でも問題なく動作します。

Q2. 同じゲーム内でキャラクターを別の場所に移動させるにはどうすればいいですか?

キャラクターのHumanoidRootPart.CFrameを書き換えるのがもっともシンプルな方法です。移動先のパーツより少し上の座標を指定すると、パーツにめり込まず自然に着地します。

Q3. ProximityPromptを使ってテレポートするにはどうすればいいですか?

パーツにProximityPromptを追加し、Triggeredイベントの中でCFrameを書き換えるスクリプトを組み合わせます。プレイヤーが近づいてボタンを押すと発動する仕組みです。

Q4. 別のゲームにテレポートするにはどうすればいいですか?

TeleportService:Teleport()に移動先のPlaceIdを指定します。PlaceIdはRoblox Creator Dashboardの「エクスペリエンスの設定」から確認できます。

Q5. 複数のプレイヤーを同時にテレポートさせることはできますか?

できます。TeleportService:TeleportAsync()の第2引数にPlayerの配列を渡すことで、複数プレイヤーを同時に同じプレースへ送れます。

 

 

まとめ

この記事では、Roblox Studioでテレポートを実装する3つの方法を解説しました。

重要なポイント:

  • 同じゲーム内の移動なら、CFrameを書き換えるだけで実装できる
  • プレイヤーの操作で発動させたいなら、ProximityPromptと組み合わせる
  • 別のゲームへ送るときは、公式のTeleportServiceを使う
  • TeleportServiceはPlaytest中に動かないため、公開後に実機で確認する
  • 複数人を同時に送るには、TeleportAsyncにPlayerの配列を渡す

どのパターンも数行のコードで実装できますが、「なぜ動かないのか」を理解しているかどうかで、作れるゲームの幅は大きく変わります。まずは①のCFrame移動から試して、動きの仕組みを体感してみてください。

TETRA UPのRobloxコースでは、こうしたスクリプトの基礎から一つずつ、プロのインストラクターと一緒に手を動かしながら学べます。ワープゾーンやミニゲームなど、自分のアイデアを実際に形にしてみませんか。

 

 

あわせて読みたい

コラム