目次
1.準備
2.処理を書く
3.動作確認する
4.解説
5.少し改変
Udonの準備がまだだったり、一度もU#触ったことがないという方は是非こちらから・・・
1.準備
今回はプレイヤーを指定した場所、向きにテレポートさせるギミックをつくります。
オブジェクトの配置
まずはいつも通り、Plane
で床を、ProjectウィンドウからVRCWorld
プレハブを置きます。
次に今回のギミックに必要な、テレポート装置とテレポート先を配置します。
テレポート装置
Cubeを配置します。
高さを0.2、Y座標を0.1にして後は適当で良いです。
ギミックであることが分かりやすいように、マテリアルの色を変えるよ良いです。
また、Cubeのインスペクターを開き、BoxCollider
のIs Trigger
を有効にしましょう。
Is Triggerを有効にすると、プレイヤーとこのCubeが重なり合うようになります。
重なり合った時に、テレポート処理を行うようにします。
分かりやすいように、オブジェクトの名前をCube→TeleportSystem
などに変えておきましょう。
テレポート先
先ほどのCubeと同じように、右クリ
→CreateEmpty
でオブジェクトを配置します。
これはTransformしか持たない 空のオブジェクト です。
このオブジェクトの先にテレポートするので、Cubeや初期スポーン地とは少し離しましょう。
同じくオブジェクト名を、Destination
など分かりやすい名前に変えておきましょう。
スクリプトの作成
今回のスクリプトは TeleportSystem
などの名前で良いです。
2.テレポート処理を書く
いままでと同じくコピペで良いです。
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 Component
でUdon Behaviour
を追加します。
追加したUdon Behaviour の Program Source
に、Teleport System
をアタッチします。
テレポート先(空オブジェクト)をアタッチする
アタッチしたTeleport System
に To Teleport
という項目があるので、そこにテレポート先であるオブジェクト、Destination
をアタッチします。
これで準備完了です。
実行
再生ボタンを押して確認してみましょう。
青いオブジェクトに触れると、Destination
と同じ場所・同じ向きにテレポートしているはずです。
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 の向きではなくプレイヤーの向きを変えずにテレポートさせることができます。
ギミックの目的によってどちらにするか決めましょう。