【cluster】オーナー以外の直接入室を禁止するワールドリダイレクトギミック

ワールド入室時にワールドオーナー以外を別ワールドに移動させるギミックです。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;

});
タイトルとURLをコピーしました