ワールドIDの異なる複数のワールド間で信号を共有することで、ワールドを跨いだギミックの作動を可能とするアイディアです。
この実現には現在ベータ版の機能である「外部通信機能」を使用します。
例えばワールドAのオブジェクトA-1の作動により「signal1」という信号が発生した場合、この信号を外部通信機能により外部のデータベース上に記録します。
一方ワールドBのオブジェクトB-1では、「signal1」の信号を待ち受けるスクリプトを仕込んでおきます。そして信号を感知したら何らかのギミックを作動するというしくみです。
データベース上で扱うのは以下の通り(外部からは判別不能)のトークンといくつかの付加情報のみです。
- id
- signals:信号(10文字の英数字)
- ttl:信号の生存時間
- created:信号の発生日時
この信号情報の記録と取得方法は下記となります。(仲介のプログラムソースは利用者側では実装不要のため割愛します)
信号の記録
$.callExternal("send_signal" + "|" + verify + "|" + "2wuuKx7SND_01:00:00", "send");
verifyには、Unityで外部通信用URLを登録した際に発行されるトークンを入れます。そして信号の登録は、[信号(10文字英数字)]_[生存時間]のフォーマットで記載します。
※”send”はmeta情報なので任意の文字列で設定。
信号の取得
$.callExternal("receive_signal" + "|" + verify + "|" + "2wuuKx7SND", "receive");
$.onExternalCallEnd((response, meta, errorReason) =>{
if(meta == "receive"){
if(response > 0){
$.log("処理実行");
}
}
});
同様に外部通信機能を使用しますが、取得の場合は生存時間の指定はいりません。meta情報は取得の際の設定と一致していれば結構です。
現在生存時間内にある指定の信号が存在すれば処理を発動するという流れです。
clusterスクリプト実装例
記録側
const verify = '入力してください';
$.onInteract(player => {
$.callExternal("send_signal" + "|" + verify + "|" + "2wuuKx7SND_01:00:00", "send");
});
オブジェクトをクリックすると信号が記録されます。
取得側
const verify = '入力してください';
const cycle = 5;
const subNode = $.subNode("Obj1");
$.onUpdate(deltaTime => {
if (!$.state.initialize) {
$.state.initialize = true;
$.callExternal("receive_signal" + "|" + verify + "|" + "2wuuKx7SND", "receive");
$.state.time = 0.0;
}
$.state.time += deltaTime;
if($.state.time >= cycle) {
$.callExternal("receive_signal" + "|" + verify + "|" + "2wuuKx7SND", "receive");
$.state.time = 0.0;
}
});
$.onExternalCallEnd((response, meta, errorReason) =>{
if(meta == "receive"){
if(response > 0){
subNode.setEnabled(false);
}
}
});
5秒毎に現在生存時間中の信号が存在しないか確認を行い、信号がある場合は子ノードのオブジェクトを消すという動作です。
活用例
- チャイムを押して部屋の中から鍵を開くと室外側のドアから移動できるようになる
- クエスト終了後に別ワールドの扉が開く
すでに一通りの構築が完了し、デモワールドでの動作確認までしています。ただ本格的に運用するとなるとサーバーの負荷が結構かかりそう?