👌

ClusterScript - スペースへの入室を検知してPlayerScriptを割り当てる

2024/11/24に公開

概要

プレイヤーが入室した時に、そのプレイヤーに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は音量の距離減衰方式を変更できません。
$.sendSignalCompatPlay Audio Source Gimmick すれば対応できます。
ただ入室音を再生したいだけなら On Join Player Trigger を使ったほうが早いでしょう。

参考

Script Referenceの_のExampleをベースにしています。
https://docs.cluster.mu/script/variables/_-1.html

Creators Guideのこの記事は少し内容が近いです。プレイヤーが入室したらアイテムを生成して、そのアイテムから $.setPlayerScript を行っています。
https://creator.cluster.mu/2024/07/08/playerscript-2/

Discussion