😺

【Roblox】別のプレースへテレポートさせる方法

2024/08/02に公開

はじめに

公式Reference

https://create.roblox.com/docs/ja-jp/projects/teleporting

実装

オブジェクトなどの配置

  • テレポートボタンの配置

  • RemoteEventの配置

移動先のプレース作成

表示タブを押しアセット管理表示ボタンを押す

するとこのようなwindowが出るのでプレースをダブルクリック

空白部分で右クリックをし新しいプレースを追加します。

追加したらそのプレースを右クリックしIDを取得しメモしておきます

またそのプレースの欄をダブルクリックすると新しくRobloxStudioが開きます

fileタブからRobloxに公開をクリックで準備完了!

コード

作成するスクリプトファイルはこちらの三つになります。

まずはLocalScriptの内容

local proximityPrompt = workspace.Part.ProximityPrompt

local remoteEvent = game.ReplicatedStorage.RemoteEvent

proximityPrompt.Triggered:Connect(function(player)
	print("Triggered")
	remoteEvent:FireServer(player)
end)

ボタンを押したらイベントをサーバー側に飛ばすようにしてます。

続いて、モジュールスクリプトでSafeTeleportというファイルを作成し以下のコードをコピペしてください。こちらは公式レファレンスに書かれてる物になります。

local TeleportService = game:GetService("TeleportService")

local ATTEMPT_LIMIT = 5
local RETRY_DELAY = 1
local FLOOD_DELAY = 15

local function SafeTeleport(placeId, players, options)
	local attemptIndex = 0
	local success, result -- define pcall results outside of loop so results can be reported later on

	repeat
		success, result = pcall(function()
			return TeleportService:TeleportAsync(placeId, players, options) -- teleport the user in a protected call to prevent erroring
		end)
		attemptIndex += 1
		if not success then
			task.wait(RETRY_DELAY)
		end
	until success or attemptIndex == ATTEMPT_LIMIT -- stop trying to teleport if call was successful, or if retry limit has been reached

	if not success then
		warn(result) -- print the failure reason to output
	end

	return success, result
end

local function handleFailedTeleport(player, teleportResult, errorMessage, targetPlaceId, teleportOptions)
	if teleportResult == Enum.TeleportResult.Flooded then
		task.wait(FLOOD_DELAY)
	elseif teleportResult == Enum.TeleportResult.Failure then
		task.wait(RETRY_DELAY)
	else
		-- if the teleport is invalid, report the error instead of retrying
		error(("Invalid teleport [%s]: %s"):format(teleportResult.Name, errorMessage))
	end

	SafeTeleport(targetPlaceId, {player}, teleportOptions)
end

TeleportService.TeleportInitFailed:Connect(handleFailedTeleport)

return SafeTeleport

そしてScriptファイルでこれらの処理を書き合わせ実際に動作するようにします。

local TeleportService = game:GetService("TeleportService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ServerScriptService = game:GetService("ServerScriptService")

local remoteEvent = ReplicatedStorage.RemoteEvent

local SafeTeleport =  require(ServerScriptService.SafeTeleport)

remoteEvent.OnServerEvent:Connect(function(player, targetPlaceID)
	local placedId = 18758089915
	local server = TeleportService:ReserveServer(placedId)
	local options = Instance.new("TeleportOptions")
	options.ReservedServerAccessCode = server
	SafeTeleport(placedId,{player},options)
end)

実行する

RobloxStudioではテレポートできないのでwebから自分の作成したゲームを開きRobloxを実行して試す感じになります。

https://www.roblox.com/ja/home

動画

https://youtu.be/ugE7OshT_uI

Landelテックブログ

Discussion