ワールド入室時にワールドオーナー以外を別ワールドに移動させるギミックです。KEY指定のワールドゲート接続と併用して、あるルートからの入室以外を弾くことができます。
複数ワールドを接続するゲーム企画などで利用できるかと思って作成しました。
オブジェクト構成
■Redirect(Scriptable Item)
├ OverlapCollider(Overlap Detector Shape)※Box Collider/Is Trigger
└ WrldgateCollider(World Gate)※Box Collider/Is Trigger
スクリプト
/* 設定 */
const owner = ""; // ワールドオーナーのclusterID
// 入室OKの場合の移動先
const posin = new Vector3(-5, 0, 0);
const rotin = new Vector3(0, 0, 0);
// 入室NGの場合の移動先
const posout = new Vector3(5, 0, 0);
/* 入室処理 */
$.onUpdate(deltaTime => {
// 初期化
if (!$.state.initialized) {
$.state.initialized = true;
$.state.overlapPlayers = [];
}
// 前のフレームで接触していたプレイヤーIDの一覧
let previousOverlapPlayers = $.state.overlapPlayers;
// このフレームで接触しているプレイヤーIDの一覧
let currentOverlapPlayers = [];
// 接触しているオブジェクトをすべて取得
let overlaps = $.getOverlaps();
overlaps.forEach(overlap => {
// 接触しているオブジェクトがプレイヤーであるかどうかを確認
let playerHandle = overlap.handle;
if (playerHandle == null) return;
// 現在接触しているプレイヤーの一覧に追加
currentOverlapPlayers.push(playerHandle.id);
// 前のフレームで接触していたプレイヤーは除外
if (previousOverlapPlayers.includes(playerHandle.id)) return;
// プレイヤーを座標に位置までとばす
if(playerHandle.userId==owner){
playerHandle.setRotation(new Quaternion().setFromEulerAngles(rotin));
playerHandle.setPosition(posin);
} else {
playerHandle.setPosition(posout);
}
});
$.state.overlapPlayers = currentOverlapPlayers;
});