【VRChat】落下したプレイヤーをリスポーンさせる:範囲外トリガーで安全地点へ戻す

作成: 2026-05-22

ワールドの隙間から落ちたプレイヤーを自動で安全地点へ戻す実例。VRC Scene Descriptorのスポーン設定と、範囲外トリガー+TeleportToだけで完成する落下対策ギミックを初心者向けに解説します。

概要

ワールドを作っていると、床と床の隙間や端から プレイヤーが落ちてしまい、奈落へ落下し続ける という事故がよく起こります。これを放置するとプレイヤーは戻ってこられず、最悪インスタンスをやり直すことになってしまいます。

そこで、ワールドの下に「落下検知エリア」を用意し、そこに入ったプレイヤーを自動で安全な地点へ戻す仕組みを作ります。

この記事は、テレポートの仕組みそのものを解説した テレポーターを作る:プレイヤーを瞬間移動させる方法実例編 です。理屈は同じで、「トリガーに入ったら TeleportTo() で移動させる」というパターンを、落下対策という具体的な目的に当てはめただけです。TeleportTo() の細かい仕様を知りたい場合は、先にそちらの記事を読むと理解が深まります。

そして嬉しいことに、これは 20行ほどの簡単なコードだけ で完成します。難しいネットワーク同期も不要です。

Sponsored

完成イメージと仕組み

仕組みはとてもシンプルです。

  1. ワールドの一番低い場所より さらに下 に、目に見えない大きな箱(トリガー)を置きます。
  2. プレイヤーが落下してこの箱に入ると、トリガーが反応します。
  3. その瞬間、プレイヤーをあらかじめ決めておいた 安全地点(returnPoint)TeleportTo() で戻します。
落下したプレイヤーがワールド下のトリガー(OnPlayerTriggerEnter)に入り、TeleportToでスポーン地点へ戻される仕組みの全体図

つまり、やっていることは テレポーター記事 の「パターン1: 基本的なテレポーター(トリガー式)」と まったく同じ です。違いは、テレポート先を「目的地」ではなく「安全地点」にしているだけです。

補足: VRChatには標準機能として、VRC Scene Descriptorの Respawn Height Y があります。指定した高さより下に落ちると自動でスポーン地点に戻してくれる機能です。まずはこれを設定しておけば最低限の落下対策になりますが、本記事のトリガー方式なら 戻る場所を自由に指定でき、後から効果音やエフェクトも足しやすい という利点があります。

ステップ1: リスポーン地点(スポーン地点)を設定する

まず、プレイヤーが出現する場所=戻ってくる安全地点を用意します。これはVRChatワールドの基本設定です。

  1. VRCWorldを配置する: VRChat SDKをインポートすると、Project内に「VRCWorld」プレハブが含まれています。これをHierarchyにドラッグ&ドロップすると、ワールドに必須の VRC Scene Descriptor コンポーネントが追加されます。
  2. スポーン地点のオブジェクトを作る: 空のGameObjectを作成し、「SpawnPoint」など分かりやすい名前を付けます。これをプレイヤーを出現させたい位置(地面の上)に置きます。青いZ軸の矢印が プレイヤーの正面方向 になるので、向きも調整しておきましょう。
  3. Spawns配列に登録する: VRC Scene Descriptorのインスペクターを開き、Spawns のサイズ(Size)を1にして、Element 0 に手順2で作った「SpawnPoint」をドラッグ&ドロップします。
VRC Scene DescriptorのSpawns配列のElement 0にWorldSpawnPointを登録した状態のインスペクター

これで、プレイヤーは「SpawnPoint」の位置から出現するようになります。今回はこの SpawnPointを、落下時に戻る安全地点としても再利用 します。新しい目印を作らなくてよいので簡単です。

ワールドの地面の上に配置したスポーン地点オブジェクト。ここがプレイヤーの出現位置であり、落下時に戻る安全地点になる

補足: 戻る地点をスポーン地点とは別にしたい場合は、別の空のGameObject(例: ReturnPoint)を作って好きな場所に置いてもかまいません。後のステップでどちらを使うか選べます。

ステップ2: ワールドの下に落下検知トリガーを置く

次に、落下したプレイヤーを受け止める「見えない箱」を作ります。完成イメージは下の図のとおりで、ワールドより一回り大きいトリガーを真下に薄く広げる形です。

FallTriggerの配置イメージ図。ワールドの下にBox Collider(Is Trigger)を、XとZはworldより広め・Yは薄めに広げて配置する
  1. 空のGameObjectを作成: Hierarchyで右クリック →「Create Empty」で空のGameObjectを作り、「FallTrigger」と名付けます。
  2. ワールドの真下に配置: Transformの位置(Position)のYを、ワールドの一番低い床よりも 十分に下(例: Y = -20 など)に設定します。プレイヤーが落ちてくる通り道に置くイメージです。
  3. Box Colliderを追加: 「Add Component」から Box Collider を追加します。
  4. Is Triggerにチェック: Box Colliderの Is Trigger にチェックを入れます。これでプレイヤーがすり抜けつつ「入った」ことだけを検知できるようになります。
  5. 大きく広げる: コライダーの Size(またはGameObjectのScale)を大きくして、ワールド全体を真下から覆うようにします。例えば X = 500, Z = 500, Y = 10 など、ワールドの外周より広めに取ると取りこぼしがありません。
Unityのシーンビューで、浮いているワールドの真下に大きなトリガーコライダー(緑のワイヤーフレーム)を配置した様子

これで「ワールドの下に落ちたプレイヤーは、必ずこの箱に入る」という状態ができました。あとは、入ってきたプレイヤーを戻す処理を書くだけです。

Sponsored

ステップ3: スクリプトを貼り付けて適用する

いよいよ本題のスクリプトです。「FallTrigger」にUdonBehaviour(UdonSharp)を追加し、以下のコードを貼り付けるだけで完成します。

  1. UdonBehaviourを追加: 「FallTrigger」を選択し、「Add Component」→「Udon Behaviour」を追加します。
  2. C#スクリプトを作成: Projectウィンドウで右クリック →「Create」→「U# Script」を選び、FallReturnTrigger という名前で作成します。
  3. コードを貼り付け: 作成したスクリプトを開き、中身を以下のコードに丸ごと置き換えます。

スクリプト: FallReturnTrigger.cs

using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;

public class FallReturnTrigger : UdonSharpBehaviour
{
    [SerializeField] private Transform returnPoint;

    public override void OnPlayerTriggerEnter(VRCPlayerApi player)
    {
        if (!Utilities.IsValid(player)) return;
        if (!player.isLocal) return;
        if (returnPoint == null) return;

        player.TeleportTo(returnPoint.position, returnPoint.rotation);
    }
}

たったこれだけです。1行ずつ意味を見ていきましょう。

  • [SerializeField] private Transform returnPoint;
    戻り先(安全地点)を入れておくための変数です。[SerializeField] を付けることで、UnityのInspectorからドラッグ&ドロップで割り当てられるようになります。
  • OnPlayerTriggerEnter(VRCPlayerApi player)
    プレイヤーがトリガー(Is Triggerの箱)に入った瞬間に、VRChatが自動で呼び出してくれるイベントです。
  • if (!Utilities.IsValid(player)) return;
    プレイヤーの情報が有効かどうかの安全チェックです。無効なら何もしません。お作法として入れておくと安心です。
  • if (!player.isLocal) return;
    自分自身(ローカルプレイヤー)だけ を処理するための重要なチェックです。これがないと、他人が落ちた時に自分まで巻き込まれて移動してしまう可能性があります。
  • if (returnPoint == null) return;
    戻り先が未設定のまま実行されてエラーになるのを防ぎます。
  • player.TeleportTo(returnPoint.position, returnPoint.rotation);
    本体の処理です。落ちたプレイヤーを安全地点の位置と向きへ瞬間移動させます。この TeleportTo() の詳しい仕組みは テレポーター記事 で解説しています。

Unityでの最終設定

スクリプトを保存してUnityに戻ると、「FallTrigger」のUdonBehaviourに Return Point というフィールドが表示されます。

  • ここに、ステップ1で作った 「SpawnPoint」をドラッグ&ドロップ します。
設定の全体像。同じSpawnPointを、VRC Scene DescriptorのSpawns[0]と、FallReturnTriggerのReturn Pointの両方に割り当てる

これで設定は完了です。コードを書き換える必要は一切なく、 コピペとドラッグ&ドロップだけ で落下対策ギミックが完成しました。

Sponsored

ステップ4: 動作を確認する(実演)

設定できたら、実際に動かして確認してみましょう。

  1. VRChat SDKの「Build & Test」でローカルテストを起動します。
  2. ワールドの端や床の隙間から、わざと落下してみます。
  3. 下まで落ちて落下検知トリガーに入った瞬間、 一瞬でSpawnPointの位置に戻ってくれば成功 です。
シーンビューでの落下検知範囲と、実際にテストプレイして落下・復帰を確認している様子

落ちても自動で戻ってくるので、プレイヤーが奈落に取り残される心配がなくなりました。これだけのコードで、ワールドの安全性が大きく向上します。

補足: もし戻らない場合は、(1) Box Colliderの Is Trigger がオンになっているか、(2) コライダーが落下経路をきちんと覆っているか、(3) UdonBehaviourの Return Point にSpawnPointが割り当てられているか、の3点を確認してください。

まとめ

  • 落下対策は「 ワールドの下に大きなトリガーを置き、入ったプレイヤーを TeleportTo() で戻す 」だけで実装できます。
  • 戻り先は、スポーン地点(SpawnPoint)をそのまま使い回すのが手軽です。
  • スクリプトは20行ほどで、 コピペとドラッグ&ドロップだけ で動きます。コードを書き換える必要はありません。
  • player.isLocal のチェックを入れて、自分だけが移動するようにするのが重要なポイントです。
  • 仕組みの土台は テレポーターを作る記事 と同じです。テレポートの理屈をしっかり理解したい場合はそちらも合わせて読んでみてください。

落下事故はプレイヤー体験を大きく損なう要素のひとつです。この簡単なギミックを最初に仕込んでおくだけで、安心して遊んでもらえるワールドになります。ぜひ自分のワールドにも導入してみてください。