【cluster】外部通信を利用したセーブポイント機能

①外部通信URLの設定

外部通信URLに下記を追加してください。

https://metaba-resort.com//api/cck_save.php

②スクリプト解説

セーブ側

Save(ScriptableItem)
└ sound(AudioSource)

const verify_token = "ベリファイトークン";
const external_endpoint_id = new ExternalEndpointId("エンドポイントID");
const subNode = $.subNode("sound");
const rid = "セーブポイントID";

$.onInteract((playerHandle) => {

  subNode.setEnabled(false);
  $.callExternal(external_endpoint_id, "add_savepoint" + "|" + verify_token + "|" + playerHandle.userId + "-" + rid, "call external");
  subNode.setEnabled(true);

});

※セーブポイントIDは任意のユニークな英数字の組み合わせでOKです。
※データ保持期間は1週間の設定となっています。

ロード側

Load(ScriptableItem)
└ OverlapCollider(OverlapDetectorShape)

const verify_token = "ベリファイトークン";
const external_endpoint_id = new ExternalEndpointId("エンドポイントID");
const rid = "セーブポイントID";

/* 入室可の場合の移動先 */
const posin  = new Vector3(11, 14, 10);
const rotin  = new Vector3(0, 90, 0);

/* 入室不可の場合の移動先 */
const posout = new Vector3(-2, -3, 0);

/* 入室処理 */
$.onUpdate(deltaTime => {

  // 初期化
  if (!$.state.initialized) {

      $.state.initialized = true;
      $.state.overlapPlayers = [];
      $.state.plist = [];

  }

  // 前のフレームで接触していたプレイヤーIDの一覧
  let previousOverlapPlayers = $.state.overlapPlayers;

  // このフレームで接触しているプレイヤーIDの一覧
  let currentOverlapPlayers = [];

  // 接触しているオブジェクトをすべて取得
  let overlaps = $.getOverlaps();

  overlaps.forEach(overlap => {

      // 接触しているオブジェクトがプレイヤーであるかどうかを確認
      $.state.playerHandle = overlap.handle;
      if ($.state.playerHandle == null) return;

      // 現在接触しているプレイヤーの一覧に追加
      currentOverlapPlayers.push($.state.playerHandle.id);

      // 前のフレームで接触していたプレイヤーは除外
      if (previousOverlapPlayers.includes($.state.playerHandle.id)) return;

      // 判定処理
      if(verify != "" && rid != ""){

        $.callExternal(external_endpoint_id, "savepoint_check" + "|" + verify_token + "|" + $.state.playerHandle.userId + "-" + rid, "check");

      } else {

        $.state.playerHandle.setPosition(posout);

      }

  });

  $.state.overlapPlayers = currentOverlapPlayers;

});
/* 外部通信後の処理 */
$.onExternalCallEnd((response, meta, errorReason) =>{

  if(meta == "check"){

    if(response!=""){

      $.state.playerHandle.setRotation(new Quaternion().setFromEulerAngles(rotin));
      $.state.playerHandle.setPosition(posin);

    } else {

      $.state.playerHandle.setPosition(posout);

    }

  }

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