テレポートする

記事の内容

Youtubeで紹介したテレポートのコードを貼り付けていくよ。動画も見てね!

テレポートってなに?

プレイヤーを別の場所に移動させる(以下、テレポート)ことができるよ!
テレポートは応用することによって色々できるよ!例えば、

  • ものに触れたら別の場所に移動する(土管とか、ワープポイントとか)
  • ホームボタンが押されたら、家に戻る
  • プレイヤーがゲームの開始人数まで集まったら、移動する

なんかが考えられるね。

もっけ
もっけ

「ものに触れたら別の場所に移動する」、「ホームボタンが押されたら、家に戻る」を例にして、作り方を紹介していくよ!

パーツに触れてテレポートする

ここでは、パーツに触れたときにテレポートさせる実装方法を説明していくよ。

① ReplicatedStorage にModule Scriptを追加しよう
Module Script の名前をTeleportWithinPlaceに変えてね

local ReplicatedStorage = game:GetService("ReplicatedStorage") -- 入れ物
local Players = game:GetService("Players") -- プレイヤーの情報

local TeleportWithinPlace = {}

-- リモートイベント用のインスタンスを作る
local teleportEvent = Instance.new("RemoteEvent")
teleportEvent.Name = "TeleportEvent"
teleportEvent.Parent = ReplicatedStorage

function TeleportWithinPlace.Teleport(humanoid, params)
	local character = humanoid.Parent

	-- パラメータのfreezeが設定(true)されたいたら、テレポート中はプレイヤーをフリーズする
	if params.freeze then
		-- プレイヤーの歩く速度を”DefaultWalkSpeed”に保存する
		humanoid:SetAttribute("DefaultWalkSpeed", humanoid.WalkSpeed)
		-- プレイヤーのジャンプ力を”DefaultJumpPower”に保存する
		humanoid:SetAttribute("DefaultJumpPower", humanoid.JumpPower)
		-- プレイヤーの歩く速度を0にする
		humanoid.WalkSpeed = 0
		-- プレイヤーのジャンプ力を0にする
		humanoid.JumpPower = 0
	end

	-- プレイヤーのタイプからテレポート後の高さを計算する
	local rootPartY
	if humanoid.RigType == Enum.HumanoidRigType.R15 then
		rootPartY = (humanoid.RootPart.Size.Y * 0.5) + humanoid.HipHeight
	else
		rootPartY = (humanoid.RootPart.Size.Y * 0.5) + humanoid.Parent.LeftLeg.Size.Y + humanoid.HipHeight
	end

	-- プレーヤーをテレポートし、該当する場合は場所周辺のコンテンツをリクエストします
	local position = CFrame.new(params.destination + Vector3.new(0, rootPartY, 0))
	local orientation = CFrame.Angles(0, math.rad(params.faceAngle), 0)
	if workspace.StreamingEnabled then
		local player = Players:GetPlayerFromCharacter(character) --指定プレイヤーの情報取得
		player:RequestStreamAroundAsync(params.destination) -- プレイヤーのテレポート先をストリーミング
	end
	character:SetPrimaryPartCFrame(position * orientation) -- モデルを指定位置に移動

	-- フリーズされたプレイヤーを戻す
	if params.freeze then
		-- プレイヤーの歩く速度を標準に戻す
		humanoid.WalkSpeed = humanoid:GetAttribute("DefaultWalkSpeed")
		-- プレイヤーのジャンプ力を標準に戻す
		humanoid.JumpPower = humanoid:GetAttribute("DefaultJumpPower")
	end
end

return TeleportWithinPlace
もっけ
もっけ

このスクリプトは色んなところから呼ばれるから汎用性が高いんだぜ

②パーツにScriptを追加しよう
Script の名前は何でも良いよ。

local ReplicatedStorage = game:GetService("ReplicatedStorage") -- 入れ物

local teleportPart = script.Parent

-- プレイヤーがテレポートする位置
local TELEPORT_DESTINATION = Vector3.new(-77.885, 0, -4.062) -- 家の前
-- テレポート後のプレイヤーの角度
local TELEPORT_FACE_ANGLE = 0
-- テレポート中は、プレイヤーを「フリーズ」するか、移動やジャンプを防ぐか
local FREEZE_CHARACTER = true

-- テレポート用のモジュールスクリプトを呼び出し
local TeleportWithinPlace = require(ReplicatedStorage:WaitForChild("TeleportWithinPlace"))

local function teleportPlayer(otherPart)
	-- 触れたものがプレイヤー(人間)かどうか調べる	
	local character = otherPart.Parent
	local humanoid = character:FindFirstChild("Humanoid")
	
	if humanoid and not humanoid:GetAttribute("Teleporting") then
		-- プレイヤーがテレポート中でないとき、プレイヤーにテレポート中を設定する		
		humanoid:SetAttribute("Teleporting", true)

		local params = {
			destination = TELEPORT_DESTINATION,
			faceAngle = TELEPORT_FACE_ANGLE,
			freeze = FREEZE_CHARACTER
		}
		-- テレポート用のモジュールスクリプトを呼び出し、プレイヤーと座標位置の情報を渡す
		TeleportWithinPlace.Teleport(humanoid, params)
		-- 1秒待つ
		wait(1)
		--テレポート完了したとみなして、プレイヤーに設定したテレポート中を解除する
		humanoid:SetAttribute("Teleporting", nil)
	end
end

-- 触れたらteleportPlayer()関数を呼び出す
teleportPart.Touched:Connect(teleportPlayer)
もっけ
もっけ

このScriptは、パーツに触れたプレイヤーがテレポートするよ

ボタンを押してテレポートする

ここでは、画面上のボタンが押されたときにテレポートさせる実装方法を説明していくよ。
①ボタンにLocal Script を追加しよう

local ReplicatedStorage = game:GetService("ReplicatedStorage") -- 入れ物

local button = script.Parent

-- プレイヤーがテレポートする位置
local TELEPORT_DESTINATION = Vector3.new(-40.758, 4.504, 60.111) -- 座布団の位置
-- テレポート後のプレイヤーの角度
local TELEPORT_FACE_ANGLE = 30 -- 机の前を向くように設定
-- テレポート中は、プレイヤーを「フリーズ」するか、移動やジャンプを防ぐか
local FREEZE_CHARACTER = true

local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent") -- TeleportEventのインスタンスを持つ

local function onButtonActivated()
	local params = {
		destination = TELEPORT_DESTINATION,
		faceAngle = TELEPORT_FACE_ANGLE,
		freeze = FREEZE_CHARACTER
	}
	teleportEvent:FireServer(params) -- サーバへ発動
end

button.Activated:Connect(onButtonActivated)
もっけ
もっけ

画面に表示したボタンを押すと、テレポートするように作ってるよ

②Server にScript を追加しよう

ocal ReplicatedStorage = game:GetService("ReplicatedStorage") -- 入れ物

-- テレポート用のモジュールを要求する
local TeleportWithinPlace = require(ReplicatedStorage:WaitForChild("TeleportWithinPlace")) -- TeleportWithinPlaceのインスタンスを入れる

-- サーバイベントでモジュール関数を起動
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent") -- TeleportEventのインスタンスを入れる
teleportEvent.OnServerEvent:Connect(function(player, params)
	-- プレイヤー(人間)かどうか調べる	
	local character = player.Character
	if not character or not character.Parent then
		character = player.CharacterAdded:Wait()
	end
	local humanoid = character:FindFirstChild("Humanoid")

	if humanoid and not humanoid:GetAttribute("Teleporting") then
		-- プレイヤーがテレポート中でないとき、プレイヤーにテレポート中を設定する
		humanoid:SetAttribute("Teleporting", true)
		-- テレポート用のモジュールスクリプトを呼び出し、プレイヤーと座標位置の情報を渡す
		TeleportWithinPlace.Teleport(humanoid, params)
		-- 1秒待つ
		wait(1)
		--テレポート完了したとみなして、プレイヤーに設定したテレポート中を解除する
		humanoid:SetAttribute("Teleporting", nil)
	end
end)
もっけ
もっけ

画面に表示されたボタンを押したプレイヤーだけがテレポートするよ

ここまでこれたね、おつかれさま

サラ
サラ

おっつー

© もっけチャンネル提供

コメント

タイトルとURLをコピーしました