0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

U#でプレイヤーをテレポートさせる

Posted at

目次
1.準備
2.処理を書く
3.動作確認する
4.解説
5.少し改変

Udonの準備がまだだったり、一度もU#触ったことがないという方は是非こちらから・・・

1.準備

今回はプレイヤーを指定した場所、向きにテレポートさせるギミックをつくります。

オブジェクトの配置

まずはいつも通り、Planeで床を、ProjectウィンドウからVRCWorldプレハブを置きます。

次に今回のギミックに必要な、テレポート装置とテレポート先を配置します。

テレポート装置

Cubeを配置します。
高さを0.2、Y座標を0.1にして後は適当で良いです。
TeleportSystemObj.png
image.png
ギミックであることが分かりやすいように、マテリアルの色を変えるよ良いです。

また、Cubeのインスペクターを開き、BoxColliderIs Triggerを有効にしましょう。
ColliderIsTrigger.png

Is Triggerを有効にすると、プレイヤーとこのCubeが重なり合うようになります。
重なり合った時に、テレポート処理を行うようにします。

分かりやすいように、オブジェクトの名前をCube→TeleportSystemなどに変えておきましょう。

テレポート先

先ほどのCubeと同じように、右クリCreateEmptyでオブジェクトを配置します。
EmptyObject.png
これはTransformしか持たない 空のオブジェクト です。
このオブジェクトの先にテレポートするので、Cubeや初期スポーン地とは少し離しましょう。

同じくオブジェクト名を、Destinationなど分かりやすい名前に変えておきましょう。

スクリプトの作成

今回のスクリプトは TeleportSystem などの名前で良いです。
image.png

2.テレポート処理を書く

いままでと同じくコピペで良いです。

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

public class TeleportSystem : UdonSharpBehaviour
{
    [SerializeField] private Transform _toTeleport = null;


    // プレイヤーが触れた時に実行
    public override void OnPlayerTriggerEnter(VRCPlayerApi player)
    {
        if (_toTeleport == null) {
            Debug.Log("テレポート先がアタッチされてません。");
            return;
        }

        // テレポートする
        player.TeleportTo(
            _toTeleport.position,   // 座標
            _toTeleport.rotation    // 向き
        );
    }
}

Ctrl + S で保存。絶対。

3.動作確認する

スクリプトをアタッチする

いつも通り、オブジェクトにUdonをアタッチしていきます。
テレポート用のキューブにAdd ComponentUdon Behaviourを追加します。
追加したUdon Behaviour の Program Source に、Teleport Systemをアタッチします。
UdonAtach.png

テレポート先(空オブジェクト)をアタッチする

アタッチしたTeleport SystemTo Teleport という項目があるので、そこにテレポート先であるオブジェクト、Destinationをアタッチします。
ToTeleport.png

これで準備完了です。

実行

再生ボタンを押して確認してみましょう。
青いオブジェクトに触れると、Destinationと同じ場所・同じ向きにテレポートしているはずです。

触れてもテレポートしないが、以下のようなログが出る人は、Destinationのアタッチができていないと思います。
先ほどの手順を確認してみましょう。
DebugLog.png

4.解説

OnPlayerTriggerEnter

    // プレイヤーが触れた時に実行
    public override void OnPlayerTriggerEnter(VRCPlayerApi player)
    {
        ...
    }

OnPlayerTriggerEnter()は、プレイヤーがこのオブジェクトに触れた時に実行されます。

オブジェクトの IsTrigger がオンになっていないと実行されません。

()の中にある player には、オブジェクトに触れたプレイヤーの情報が詰まっていたり、そのプレイヤーに指示を与えたりすることができる関数が入っています。

player.TeleportTo()

        // テレポートする
        player.TeleportTo(
            _toTeleport.position,   // 座標
            _toTeleport.rotation    // 向き
        );

TeleportTo()の中に、座標・向きの2つの情報を入れてあげることで、そのプレイヤーをテレポートさせることができます。
今回は、_toTeleportの座標と向きを入れてあげているので、そのオブジェクトと同じ座標と向きにテレポートしています。

5.少し改変

プレイヤーの向きを反映させる

player には、オブジェクトに触れたプレイヤーの情報が入っていると言いました。
そこで、player.TeleportTo()の中身を以下のように変えてみましょう。

        // テレポートする
        player.TeleportTo(
            _toTeleport.position,   
            player.GetRotation()    // ←ここが変わった
        );

player.GetRotation()で、プレイヤーの向きを取得することができます。

この書き方をすると、_toTeleport の向きではなくプレイヤーの向きを変えずにテレポートさせることができます。

ギミックの目的によってどちらにするか決めましょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?