①外部通信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);
}
}
});