👌
ClusterScript - スペースへの入室を検知してPlayerScriptを割り当てる
概要
プレイヤーが入室した時に、そのプレイヤーにPlayerScriptを割り当てるアイテムをつくります。
入室を検知してPlayerScriptを割り当てるアイテム
アイテムにアタッチするコンポーネントは以下のとおりです。
- Item
- Scriptable Item
- Player Script
このアイテムをSpawnPointの近くに置いてください。
特段の理由がなければ、SpawnPointと同じ位置に置きましょう。
ItemScript
Scriptable Itemの Source Code Asset
に割り当ててください。
$.setPlayerScript
を含むハンドル操作は、1アイテムにつき10回/秒に制限されています。
たくさんのプレイヤーが同時に入室した際に、全プレイヤーに対して一斉に $.setPlayerScript
を行うのではなく、0.1秒間隔で行うようにします。
$.onStart(() => {
// PlayerScriptを与えたプレイヤーを記録するstate
$.state.registeredPlayers = [];
// setPlayerScriptを10[回/秒]以上行わないための順番待ちを記録するstate
$.state.queue = [];
});
$.onUpdate(deltaTime => {
// プレイヤーの入室状況を確認する
checkPlayer();
// キューにプレイヤーが残っている場合
let queue = $.state.queue;
if(queue.length > 0){
let t = $.state.time ?? 0;
t += deltaTime;
if(t > 0.1) {
t -= 0.1
// キューの先頭にいるプレイヤーを抜き出して、PlayerScriptを割り当てる
let player = queue.shift();
$.setPlayerScript(player);
$.state.queue = queue;
}
$.state.time = t;
}
});
// 新規入室したプレイヤーがいないか確認する
function checkPlayer(){
// アイテムを中心に半径5mの範囲にいるプレイヤーを検知する
let detectedPlayers = $.getPlayersNear($.getPosition(), 5.0);
// 検知したプレイヤーそれぞれに対して処理を行う
for (let player of detectedPlayers) {
// 検知したプレイヤーがまだstateに登録されていない場合
if ($.state.registeredPlayers.some(p => p.id === player.id) === false) {
// キューの最後尾にプレイヤーを追加する
let queue = $.state.queue
queue.push(player);
$.state.queue = queue;
// PlayerScriptを与えたプレイヤーを記録するstate
$.state.registeredPlayers = [...$.state.registeredPlayers, player];
}
}
// 存在しなくなったプレイヤーを履歴から取り除く
$.state.registeredPlayers = $.state.registeredPlayers.filter(p => p.exists());
}
PlayerScript
Player Scriptの Source Code Asset
に割り当ててください。
// コンソールに「Start PlayerScript」と表示する
_.log("Start PlayerScript");
メモ
プレイヤーが入室している状態でUnityからワールドを更新したとき、On Join Player Trigger
は既に入室しているプレイヤーに対して発火しますが、このScriptは発火しません。
入室音を再生してもよいですが、ApiAudioは音量の距離減衰方式を変更できません。
$.sendSignalCompat
→ Play Audio Source Gimmick
すれば対応できます。
ただ入室音を再生したいだけなら On Join Player Trigger
を使ったほうが早いでしょう。
参考
Script Referenceの_
のExampleをベースにしています。
Creators Guideのこの記事は少し内容が近いです。プレイヤーが入室したらアイテムを生成して、そのアイテムから $.setPlayerScript
を行っています。
Discussion