Skip to content

(ニコ生ゲーム) 放送者の端末でのみ処理する

ニコ生ゲーム環境において、放送者のみ処理を行うには放送者の ID を取得、比較することにより実現できます。

凡例

javascript
let firstJoinedPlayerId = null; // 一番最初にJoinした人を覚える変数

g.game.onJoin.addOnce(function(ev) {
  // ニコ生ゲームにおいては放送者が一人だけ Join してくるため、その人の ID を放送者とする
  firstJoinedPlayerId = ev.player.id;
});

scene.onUpdate.add(function() {
  if (!firstJoinedPlayerId) return;

  if (g.game.selfId === firstJoinedPlayerId) {
    ... // 放送者の処理
  } else {
    ... // 参加者の処理
  }
}

詳細

マルチプレイゲームの流れとして、ゲームに誰かが Join します。その時の処理を追加するコードが凡例の下記部分です。

javascript
g.game.onJoin.addOnce(function (ev) {
  firstJoinedPlayerId = ev.player.id;
});

マルチプレイのニコ生ゲームでは、実行開始直後に JoinEvent が送信されます。この JoinEvent は必ず放送者のプレイヤー ID 情報を持ちます。また他に JoinEvent が送信されることはありません。そのため、最初に Join した ID を放送者の ID とすることができます。放送者の ID を比較することにより放送者のみの処理を行うことができます。

凡例のコードの下記部分で、放送者の ID と g.game.selfId を比較し、等しい場合には放送者としての処理を行い、異なる場合に参加者の処理を行います。

javascript
if (g.game.selfId === firstJoinedPlayerId) {
  ... // 放送者の処理
} else {
  ... // 参加者の処理
}

g.game.selfId は「プレイヤーごとに異なる値」です。そのため これを参照する条件分岐内の処理は ローカル処理 になる ことに注意してください。

この if 文のブロックは、明らかにプレイヤーによって実行されるかどうかが異なります。 そのためローカルイベントに対する処理と同じく、「プレイヤー間で間接的に共有されている実行状態」を破壊してはいけません。 たとえば g.game.random を利用したり、非ローカルなエンティティを生成・操作すると、他プレイヤーと実行状態がずれてしまい、マルチプレイが破綻します。

関連情報