広いワールドを作ると 、端から端まで歩くのが大変になります。2階へ上がる階段を作るより、ボタン1つで飛べたほうが早いこともあります。
VRChatには、プレイヤーを指定した場所へ移動させる仕組みがあります。ただ、そのまま使うと 床にめり込んだり、着いた瞬間にまた落ちたり します。
この記事では、位置と向きを決めて、確実に立てるテレポーター を作ります。
この記事でわかること
- 空のオブジェクトで着地点を決める設計
- 着地後の向きを制御する方法
- 落下の勢いが残る問題への対処
- テレポートは自分にしか効かないこと
変数と参照 を試した状態から始めます。
着地点は、空のオブジェクトで決める
テレポートに必要なのは、位置 と 向き の2つです。
座標を数字で直接書くこともできますが、おすすめしません。位置を調整するたびにコードを直すことになり、しかも数字を見ても着地の様子が想像できません。
代わりに、空のオブジェクトを着地点として置きます。

こうすると、こうなります。
- Sceneビューでドラッグして位置を決められる
- 青い矢印(Z軸)が、着地後の正面になる
- コードは「あのオブジェクトの場所へ」と書くだけで済む
見た目のない空のオブジェクトなので、ワールドには何も表示されません。制作者だけが見える目印です。
コードはこの1行が中心になります。
Networking.LocalPlayer.TeleportTo(destination.position, destination.rotation);
Networking.LocalPlayer は「いまこのコードを動かしているPCの持ち主」です。ここが大事な点で、テレポートできるのは自分だけ です。他の人を飛ばすことはできません。
「あの人をここへ呼びたい」という場合は、その人のPCで同じコードを実行してもらう必要があります。ネットワークイベントを使う話になるので、この記事では扱いません。
実践:ボタンで別の床へ飛ぶ
ボタンを押すと、離れた場所にある床へ飛びます。着いたら正面を向いていて、そのまま歩けます。
1. 行き先の床と着地点を置く
床のあるシーンに、次を追加します。
| 名前 | 作り方と設定 |
|---|---|
FarPlatform | Cube。(12, -0.1, 0)、Scale (4, 0.2, 4) |
TeleportButton | Cube。(0, 1, 1)、Scale (0.4, 0.4, 0.4) |
TeleportTarget | Create 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. 戻るボタンも作る
飛んだ先に戻るボタンがないと、落ちて戻るしかありません。往復できるようにします。
FarPlatformの近くにCubeを作り、ReturnButtonとして(12, 1, 1)に置く- 元の床のそばに「Create Empty」で
HomeTargetを作り、(0, 0.1, 0)、Rotation(0, 0, 0)に置く ReturnButtonに同じSimpleTeleporterを付けて、DestinationにHomeTargetを指定する
同じスクリプトを、行き先を変えて使い回せます。 処理をコードに書かず、着地点をInspectorで指定する設計にしたおかげです。
着いた瞬間に落ちるのを防ぐ
テレポートでいちばんよくあるトラブルが、着いた瞬間にまた落ちる ことです。

原因は、落下の勢い(速度)が残っている ことです。落ちている途中でテレポートすると、位置だけが変わって、下向きの勢いはそのまま引き継がれます。着地点に現れた次の瞬間、床を突き抜けて落ちていきます。
対処が SetVelocity(Vector3.zero) です。テレポートの直後に速度をゼロに戻します。
player.TeleportTo(destination.position, destination.rotation);
player.SetVelocity(Vector3.zero);
これで、その場に立った状態から始まります。
もう1つの原因が、着地点が床に埋まっている ことです。Yを床の表面と同じにすると、判定の関係でめり込むことがあります。表面より10cmほど上 に置いておくと安全です。
この2つを押さえておけば、たいていのテレポートは安定します。
うまくいかないときは
- 飛ばない → Destinationが
Noneになっていないか。起動時の警告も確認します - 床にめり込む → 着地点のYを、床の表面より10cmほど上げます
- 着いた瞬間に落ちる →
SetVelocity(Vector3.zero)を呼んでいるか確認します - 向きが変 → 着地点のRotationを調整します。Sceneビューの青い矢印が正面になります
- 他の人が飛ばない → 仕様です。テレポートできるのは自分だけです
おまけ:先に知っておくと良いこと
- トリガー式にもできる: ボタンではなく、範囲に入ったら飛ぶ形にもできます。ただし着地点が別のトリガーの中だと、無限に飛び続けます。着地点はトリガーから離してください。仕組みは トリガーでエリアを検知する を参照してください

- VRでは酔いに配慮する: 瞬間移動そのものは酔いにくいのですが、着地直後に視界が大きく回ると酔う人がいます。着地の向きは、進行方向に自然につながる角度にします
- 連打への対策: 短時間に何度も押されても困らない作りにしておきます。同じ場所へ飛ぶだけなら実害はありませんが、 演出を伴う場合は 時間差で処理を呼ぶ の考え方で弾きます
- 使いどころはいろいろ: 広い展示ワールドの区画移動、脱出ゲームの部屋の切り替え、アスレチックのスタート地点への復帰。どれも同じ形です
- 標準の落下復帰とは別物: 落ちたときに戻す仕組みは、Scene Descriptorの設定でも作れます。使い分けは 落下復帰とチェックポイント で扱います
まとめ
テレポートは、位置と向きの2つを渡すだけです。
- 着地点は空のオブジェクトで作る。Sceneビューで調整できて、向きも決まる
- 着地点は床の表面より10cmほど上に置く
TeleportToの直後にSetVelocity(Vector3.zero)で勢いを消す- 飛ばせるのは自分だけ。他の人は動かせない
作るときの問いかけは、「着いた瞬間、そのまま歩き出せるか」 です。めり込みも落下もなければ合格です。
次は、落ちたときに戻す仕掛けです。落下復帰とチェックポイント へ進むか、他のワールドへの入口を置くなら ポータルで他のワールドへつなぐ、範囲での検知を作るなら トリガーでエリアを検知する が入口です。