【VRChat】テレポーターを作る:移動先の位置と向きを決める

作成: 2025-12-19最終更新: 2026-09-09

ボタンから自分を移動させるテレポーターを作ります。空のTransformで着地点と向きを決める設計、床にめり込む問題、落下の勢いが残る問題への対処を解説します。

広いワールドを作ると、端から端まで歩くのが大変になります。2階へ上がる階段を作るより、ボタン1つで飛べたほうが早いこともあります。

VRChatには、プレイヤーを指定した場所へ移動させる仕組みがあります。ただ、そのまま使うと 床にめり込んだり、着いた瞬間にまた落ちたり します。

この記事では、位置と向きを決めて、確実に立てるテレポーター を作ります。

ボタンを押すと、別の床へ瞬間移動する

この記事でわかること

  • 空のオブジェクトで着地点を決める設計
  • 着地後の向きを制御する方法
  • 落下の勢いが残る問題への対処
  • テレポートは自分にしか効かないこと

変数と参照 を試した状態から始めます。

Sponsored


着地点は、空のオブジェクトで決める

テレポートに必要なのは、位置向き の2つです。

座標を数字で直接書くこともできますが、おすすめしません。位置を調整するたびにコードを直すことになり、しかも数字を見ても着地の様子が想像できません。

代わりに、空のオブジェクトを着地点として置きます。

空のオブジェクトを置いて、その位置と向きを着地点にする

こうすると、こうなります。

  • Sceneビューでドラッグして位置を決められる
  • 青い矢印(Z軸)が、着地後の正面になる
  • コードは「あのオブジェクトの場所へ」と書くだけで済む

見た目のない空のオブジェクトなので、ワールドには何も表示されません。制作者だけが見える目印です。

コードはこの1行が中心になります。

Networking.LocalPlayer.TeleportTo(destination.position, destination.rotation);

Networking.LocalPlayer は「いまこのコードを動かしているPCの持ち主」です。ここが大事な点で、テレポートできるのは自分だけ です。他の人を飛ばすことはできません。

「あの人をここへ呼びたい」という場合は、その人のPCで同じコードを実行してもらう必要があります。ネットワークイベントを使う話になるので、この記事では扱いません。

Sponsored

実践:ボタンで別の床へ飛ぶ

ボタンを押すと、離れた場所にある床へ飛びます。着いたら正面を向いていて、そのまま歩けます。

1. 行き先の床と着地点を置く

床のあるシーンに、次を追加します。

名前作り方と設定
FarPlatformCube。(12, -0.1, 0)、Scale (4, 0.2, 4)
TeleportButtonCube。(0, 1, 1)、Scale (0.4, 0.4, 0.4)
TeleportTargetCreate Empty。(12, 0.1, 0)、Rotation (0, 180, 0)
手前のボタンと、離れた行き先の台

FarPlatform は元の床から12m離れた場所にある、4m四方の床です。上面はY=0になります。

TeleportTarget が着地点です。Yを0.1にして、床の表面より少し上に置いています。 ぴったり0だと、めり込むことがあります。

Rotationの Y = 180 は、着いたときに元の床のほうを向くための設定です。Sceneビューで TeleportTarget を選ぶと青い矢印が見えるので、それが向いている方向が着地後の正面になります。

2. コードを書く

Assets/Scripts で「Create → U# Script」を選び、SimpleTeleporter を作ります。

using UdonSharp;
using UnityEngine;
using VRC.SDKBase;

[UdonBehaviourSyncMode(BehaviourSyncMode.None)]
public class SimpleTeleporter : UdonSharpBehaviour
{
    [SerializeField] private Transform destination;

    public override void Interact()
    {
        if (destination == null)
        {
            Debug.LogWarning("[Teleporter] Destinationが未設定です。");
            return;
        }

        VRCPlayerApi player = Networking.LocalPlayer;
        if (!Utilities.IsValid(player)) return;

        // 位置と向きをまとめて渡す
        player.TeleportTo(destination.position, destination.rotation);

        // 落ちる勢いを消す
        player.SetVelocity(Vector3.zero);

        Debug.Log("[Teleporter] 移動しました");
    }
}

短いです。TeleportTo に、着地点の 位置と回転をそのまま渡している ところがポイントです。

Utilities.IsValid(player) は、プレイヤーが有効かを確かめる書き方です。まれに取得できないことがあるので、使う前に確認します。

SetVelocity(Vector3.zero) の意味は、次の節で説明します。

3. 割り当てて確かめる

TeleportButton に Udon Behaviour を追加し、SimpleTeleporter を指定します。Destinationに TeleportTarget をドラッグします。Interaction Text は 向こうへ飛ぶ にします。

Playして押してみてください。

操作期待する結果
ボタンを押す一瞬で FarPlatform の上に立つ
着地直後元の床のほう(Z軸の向き)を向いている
そのまま歩く床の上を普通に歩ける
床の端から落ちる標準の落下復帰でスポーン地点へ戻る

4. 戻るボタンも作る

飛んだ先に戻るボタンがないと、落ちて戻るしかありません。往復できるようにします。

  1. FarPlatform の近くにCubeを作り、ReturnButton として (12, 1, 1) に置く
  2. 元の床のそばに「Create Empty」で HomeTarget を作り、(0, 0.1, 0)、Rotation (0, 0, 0) に置く
  3. ReturnButton に同じ SimpleTeleporter を付けて、Destinationに HomeTarget を指定する

同じスクリプトを、行き先を変えて使い回せます。 処理をコードに書かず、着地点をInspectorで指定する設計にしたおかげです。

着いた瞬間に落ちるのを防ぐ

テレポートでいちばんよくあるトラブルが、着いた瞬間にまた落ちる ことです。

落下の勢いが残ったままだと床を突き抜ける

原因は、落下の勢い(速度)が残っている ことです。落ちている途中でテレポートすると、位置だけが変わって、下向きの勢いはそのまま引き継がれます。着地点に現れた次の瞬間、床を突き抜けて落ちていきます。

対処が SetVelocity(Vector3.zero) です。テレポートの直後に速度をゼロに戻します。

player.TeleportTo(destination.position, destination.rotation);
player.SetVelocity(Vector3.zero);

これで、その場に立った状態から始まります。

もう1つの原因が、着地点が床に埋まっている ことです。Yを床の表面と同じにすると、判定の関係でめり込むことがあります。表面より10cmほど上 に置いておくと安全です。

この2つを押さえておけば、たいていのテレポートは安定します。

Sponsored

うまくいかないときは

  • 飛ばない → Destinationが None になっていないか。起動時の警告も確認します
  • 床にめり込む → 着地点のYを、床の表面より10cmほど上げます
  • 着いた瞬間に落ちるSetVelocity(Vector3.zero) を呼んでいるか確認します
  • 向きが変 → 着地点のRotationを調整します。Sceneビューの青い矢印が正面になります
  • 他の人が飛ばない → 仕様です。テレポートできるのは自分だけです

おまけ:先に知っておくと良いこと

  • トリガー式にもできる: ボタンではなく、範囲に入ったら飛ぶ形にもできます。ただし着地点が別のトリガーの中だと、無限に飛び続けます。着地点はトリガーから離してください。仕組みは トリガーでエリアを検知する を参照してください
トリガーで飛ばす場合は、着地点を検知範囲から離す
  • VRでは酔いに配慮する: 瞬間移動そのものは酔いにくいのですが、着地直後に視界が大きく回ると酔う人がいます。着地の向きは、進行方向に自然につながる角度にします
  • 連打への対策: 短時間に何度も押されても困らない作りにしておきます。同じ場所へ飛ぶだけなら実害はありませんが、演出を伴う場合は 時間差で処理を呼ぶ の考え方で弾きます
  • 使いどころはいろいろ: 広い展示ワールドの区画移動、脱出ゲームの部屋の切り替え、アスレチックのスタート地点への復帰。どれも同じ形です
  • 標準の落下復帰とは別物: 落ちたときに戻す仕組みは、Scene Descriptorの設定でも作れます。使い分けは 落下復帰とチェックポイント で扱います

まとめ

テレポートは、位置と向きの2つを渡すだけです。

  • 着地点は空のオブジェクトで作る。Sceneビューで調整できて、向きも決まる
  • 着地点は床の表面より10cmほど上に置く
  • TeleportTo の直後に SetVelocity(Vector3.zero) で勢いを消す
  • 飛ばせるのは自分だけ。他の人は動かせない

作るときの問いかけは、「着いた瞬間、そのまま歩き出せるか」 です。めり込みも落下もなければ合格です。

次は、落ちたときに戻す仕掛けです。落下復帰とチェックポイント へ進むか、他のワールドへの入口を置くなら ポータルで他のワールドへつなぐ、範囲での検知を作るなら トリガーでエリアを検知する が入口です。

VRChat このセクションのノート63