表示モード
マルチプレイのニコ生ゲームでは、配信に流れたコメントを受信して、ゲーム内で利用することができます。
コメントを受け取ることで「視聴者のコメントに応じてゲームの展開が変化する」「放送者のコメントによってゲームを制御する」といったコンテンツが作成できます。
INFO
ニコ生ゲームでコメントを受信するには、次の手順が必要です。
environment.external.namagameComment
onMessage
g.game.external.namagameComment
start()
コメントの受信開始・停止は g.game.external.namagameComment (namagameComment プラグイン) で行います (3)。 このプラグインを使うために game.json を編集する必要があります (1)。 配信に送られたコメントはメッセージイベント (g.MessageEvent) としてゲームに通知されるため、 onMessage トリガーのハンドラで受け取ることができます (2)。
g.MessageEvent
TIP
namagameComment のように g.game.external 以下に与えられる機能を 外部プラグイン (または単に "プラグイン") と呼びます。 Akashic ゲームは、必要な外部プラグインを game.json で宣言することができます。 ただしどの外部プラグインが利用できるかは実行環境に依存します。
g.game.external
namagameComment プラグインは、ニコニコ生放送のほか akashic serve コマンドで利用できます。 (参照: #動作確認)
game.json に environment.external.namagameComment プロパティを追加してください。 値は現在のところ "0" とする必要があります。
"0"
{ "environment": { "sandbox-runtime": "3", "external": { "namagameComment": "0" } } }
これによりゲーム内で g.game.external.namagameComment を利用できるようになります。
コメントはゲームに対して g.MessageEvent として送られます。 シーン (g.Scene) の onMessage トリガーにハンドラを登録して、ゲームに必要な形でコメントを処理してください。
g.Scene
以下は、受信したコメントの情報をコンソールに出力するだけのコード例です。
// scene はコメントを受信したいシーンとする。 scene.onMessage.add((ev) => { // .data.type が "namagame:comment" であるのがコメント通知イベント。 if (ev.data && ev.data.type === "namagame:comment") { // .data.comments にコメント情報の配列が与えられる。 const comments = ev.data.comments; for (const c of comments) { // 各コメント情報からコメント本文などを取得できる。 console.log( c.comment, // コメント本文 c.isAnonymous // 匿名コメントであるか否か ); } } });
コメントを通知するイベントは「data.type プロパティが "namagame:comment" である g.MessaveEvent 」として通知されます。 data.comments にコメント情報が配列で格納されています。
data.type
"namagame:comment"
g.MessaveEvent
data.comments
このコード例ではコメント情報のうち、コメント本文 (comment プロパティ) と 「匿名コメントであるかどうか」のフラグ (isAnonymous プロパティ) を利用しています。 (他のプロパティについては 後述)
comment
isAnonymous
大量のコメントを受信する際の通信量を減らすため、 comments は配列になっています。 上のコード例では for-of 文で単純にすべてのコメント情報を順に処理しています。 頻度が高くなければ、コメントは一つずつ (長さ 1 の配列で) MessageEvent として通知されます。
comments
MessageEvent
受信開始は namagameComment プラグインの start() メソッドで行います。
g.game.external.namagameComment?.start();
?. を使っていることに注意してください。
?.
これはこのプラグインが、ニコニコ生放送のサーバ上の (視聴者に対応しない) 特殊なインスタンスにしか存在しないためです。 その一箇所で呼び出しさえすれば、マルチプレイの全員がコメント通知イベントを受信できるようになっています。 そのため ?. を使うなどして「プラグインがある環境では start() を呼び出し、ない環境では何もしないでおく」必要があります。
TIP: ?. 演算子のサポート
?. (optional chaining) 演算子は、akashic-cli@3.0.0 以降で利用できるようになりました。 (参考: ニコ生ゲームを作ろう » ECMAScript のバージョン (JavaScript で利用できる機能) について)
akashic-cli@3.0.0
以前のバージョンでは、if 文などを使って書く必要があります。
if (g.game.external.namagameComment) g.game.external.namagameComment.start();
ただし、いずれにせよ akashic serve でコメント機能を動作確認するには、後述のとおり 3.0.7 (予定) 以降の akashic-cli が必要です。バージョンが古い場合は npm install -g @akahsic/akashic-cli を実行して、最新に更新することをおすすめします。
3.0.7
akashic-cli
npm install -g @akahsic/akashic-cli
コメントが必要なくなった時には、 stop() メソッドで受信を停止してください。
stop()
g.game.external.namagameComment?.stop();
akashic serve コマンドで、namagameComment プラグインを含む動作確認が可能です。 akashic serve 上では次の方法でコメントを送信でき、またゲーム内で受信できます。
akashic serve
これらの機能は akashic-cli@3.0.10 以降で利用可能です。
akashic-cli@3.0.10
akashic serve の開発者ツール、 Niconico タブでコメントを送信できます。
開発者ツールの Niconico タブで、画面左側から "Comment" を選択すると、以下の UI が表示されます。
画面下側の開発者ツール (devtool) 部分は、画面右上のハンバーガーボタン () を押すと表示されます。
コメント入力欄では、コメント本文とコマンドとして任意の文字列を指定できます。 "Send" ボタンを押すと、送信者タイプ (Anonymous, Named, Broadcaster) に応じた内容でコメントが送信されます。
true
userID
false
vpos
undefined
TIP 放送者コメントの確認
serve が --target-service nicolive (または -s nicolive) で起動されている場合、 最初に開かれたウィンドウが放送者役として扱われます (詳細)。 このウィンドウの送信者タイプは Broadcaster に固定されます。 また他のウィンドウでは Broadcaster を選択できなくなります。
--target-service nicolive
-s nicolive
Comment の画面は、 game.json の environment.external.namagameComment フィールドがあるゲームでのみ有効になります。
動作確認中に都度入力する手間を省くため、事前にコメントのテンプレートを作成しておくことができます。
テンプレートの設定がある場合、コメント入力欄の上に "Template" 列が表示されます。 この列のボタン押下で指定したコメント (複数可) を送信できます。
テンプレートは、 sandbox.config.js の external.namagameComment.templates フィールドで指定します。
external.namagameComment.templates
TIP sandbox.config.js
sandbox.config.js は akashic serve/sandbox コマンドの設定ファイルです。 game.json のあるディレクトリにこの名前のファイルを置くと、起動時に自動的に認識されます。 詳細は リファレンス » 設定ファイル » sandbox.config.js の仕様 を参照してください。
次の例は、「あいうえお」というコメントが 3 度送られるテンプレート "あいうえおx3" を記載した sandbox.config.js です。
module.exports = { external: { namagameComment: { templates: { // (テンプレート名): (内容) の形式で指定 "あいうえおx3": { // コメントの内容 comments: [ // userID: pid1 が非匿名で「あいうえお」とコメント { comment: "あいうえお", userID: "pid1", isAnonymous: false }, // 最初のコメントの 300 フレーム後、放送者コメントとして「かきくけこ」とコメント { comment: "かきくけこ", isAnonymous: false, frame: 300 }, // 最初のコメントの 1000 フレーム後、匿名で「らりるれろ」とコメント { comment: "らりるれろ", userId: "ghijkl", isAnonymous: true, frame: 1000 }, ], }, }, }, }, };
comments の各要素には、コメント情報に存在するフィールドをすべて指定できます (参考: #コメント通知イベント) 。 さらに frame プロパティで、送信開始から何フレーム後に送信するかも指定できます (指定しなければ直前のコメントと同時に送られます) 。
frame
そのほかテンプレートでは、特定タイミングでの自動送信も指定できます。 詳細は #コメントテンプレート の節を参照してください。
このページの以下の部分は、各 API やデータの仕様をまとめています。
namagameComment プラグインは、 start(), stop() の 2 つのメソッドを持ちます。
WARNING
このプラグインはインスタンスによって存在しない場合があります。 各メソッドは ?. 演算子などを使って、常に存在を確認してから呼び出してください 。
start() はコメントの受信を開始します。
g.game.external.namagameComment.start(opts, callback);
引数 opts はコメント受信のオプション、 callback は完了時に呼び出されるコールバックです。 ただしどちらも省略できます。
opts
callback
第一引数 opts は将来の拡張に備えたもので、現在のところ未使用です。 (型定義上は null や {} を渡せるようになっています)
null
{}
第二引数 callback は、 start() の完了時に呼び出される関数です。 呼び出しの際、以下の引数が与えられます。
err
Error
完了を待つ必要がなく、エラーに対して行う処理がない場合は、 callback を省略することができます。
start() の戻り値は undefined です。
stop() はコメントの受信を停止します。
g.game.external.namagameComment.stop();
引数はありません。戻り値は undefined です。
配信上のコメントは、 コメント通知イベント としてゲームに与えられます。 コメント通知イベントは、次の条件を満たすイベント ev です。
ev
ev.player.id
":akashic"
ev.data
type
g.MessageEvent の data.type を確認することで、そのイベントがコメント通知イベントかどうか判別することができます。
data プロパティは undefined や null でもありうることに注意してください。 data が null などでも動作する形で判定を行う必要があります。
data
ev.data?.type === "namagame:comment";
コメント通知イベントの comments は、コメント情報の配列です。 コメント情報 は、次のプロパティを持つオブジェクトです。
string
command
boolean
number
TIP コメントの分類
すなわちコメントは次のようなコードで振り分けることができます。
if (comment.userID === undefined) { // 放送者のコメント } else { // 視聴者のコメント // さらに匿名かどうかで処理を分けるなら if (comment.isAnonymous) { // 視聴者の匿名コメント } else { // 視聴者の非匿名コメント } }
注意: userID とプレイヤー ID
コメント情報の userID は、ゲーム内のプレイヤー ID (g.game.selfId や、イベントの player.id プロパティで得られる値) と比較することができます。
g.game.selfId
player.id
しかしニコニコ生放送のコメントは、デフォルトでは匿名 (「なふだ機能」が OFF) になっています (参考: なふだ機能とは) 。 少なくないコメントにおいて userID が匿名化された値になっている可能性が高く、 コメントの送信者とゲームのプレイヤーを紐づけることは必ずしもできない 点に注意してください (放送者コメントを除き) 。
「ゲームに参加しているプレイヤーのコメント」を特に識別したい場合は、 「ゲーム内で "なふだ機能" を ON にするよう求める」 「メインゲーム開始前にプレイヤーにテストコメントを送信させて確認する」など、ゲーム側での対応が必要になります。
補足: vpos と受信順
ゲームがコメント通知イベントを 受信する順 は、vpos の値と厳密に対応する保証はありません。 いくらか前後する可能性があります。
コメントリスト (配信画面のコメント一覧) の表示順にできるだけ合わせて順序を判定したい場合は、 vpos の値で比較してください。 ただし vpos で比較してもなお、センチ秒 (1/100 秒) 単位で同一時刻のコメントの順序は保証されません。 そもそも放送者コメントは vpos が与えられないこともあり、コメントリストの表示順を完全に再現することはできないものとして扱ってください。
sandbox.config.js の external.namagameComment.templates は、コメントテンプレートのテーブルです。 存在する場合、templates はオブジェクトでなければなりません。 templates の各キーはテンプレート名、値は対応するコメントテンプレートです。
templates
// sandbox.config.js の external.namagameComment.templates の構造 { external: { namagameComment: { templates: { "<テンプレート名A>": {/* コメントテンプレート */}, "<テンプレート名B>": {/* コメントテンプレート */}, // ... } } } }
コメントテンプレートは、次の要素を持つオブジェクトです。
startBy
"playStart"
"pluginStart"
"manual"
comments はコメント内容を指定するオブジェクトの配列です。その各要素は次のプロパティを持ちます。
0
startBy は自動送信の有無・タイミングを指定します。値は次のいずれかです。
startBy の指定に関わらず、全てのコメントテンプレートは serve の UI からボタンで送信できます。
次のコードは、三種類のコメントテンプレートを定義した sandbox.config.js の例です。
module.exports = { external: { namagameComment: { templates: { // userID: "pid1" が非匿名で「あいうえお」と送信するテンプレート。 "あいうえお": { comments: [ { comment: "あいうえお", userID: "pid1", isAnonymous: false } ] }, // コマンド "shita red" つきの放送者コメント「あいうえお」と匿名コメント「かきくけこ」を送信するテンプレート。 "あいうえお&かきくけこ": { comments: [ { comment: "あいうえお", isAnonymous: false, command: "shita red" }, { comment: "かきくけこ", userID: "efgefg", isAnonymous: true, command: "shita red" }, ], }, // userID: "pid1" と匿名 (「なふだ機能」OFF) の二人が // 200 フレーム間隔で「わこつ」と送信するテンプレート。 // namagameComment プラグインの `start()` 後 100 フレーム目から自動送信。 "自動送信:わこつ×3": { startBy: "pluginStart", comments: [ { frame: 100, comment: "わこつ", userID: "pid1", command: "ue", isAnonymous: false }, { frame: 300, comment: "わこつ", userID: "abcabc", isAnonymous: true }, { frame: 500, comment: "わこつ", userID: "cdecde", isAnonymous: true } ] } } } } };
コメントを使う
マルチプレイのニコ生ゲームでは、配信に流れたコメントを受信して、ゲーム内で利用することができます。
コメントを受け取ることで「視聴者のコメントに応じてゲームの展開が変化する」「放送者のコメントによってゲームを制御する」といったコンテンツが作成できます。
INFO
コメントの受信
ニコ生ゲームでコメントを受信するには、次の手順が必要です。
environment.external.namagameCommentプロパティを追加するonMessageトリガーに、コメントを処理するハンドラを登録するg.game.external.namagameCommentのstart()を呼び出すコメントの受信開始・停止は
g.game.external.namagameComment(namagameComment プラグイン) で行います (3)。 このプラグインを使うために game.json を編集する必要があります (1)。 配信に送られたコメントはメッセージイベント (g.MessageEvent) としてゲームに通知されるため、onMessageトリガーのハンドラで受け取ることができます (2)。TIP
namagameComment のように
g.game.external以下に与えられる機能を 外部プラグイン (または単に "プラグイン") と呼びます。 Akashic ゲームは、必要な外部プラグインを game.json で宣言することができます。 ただしどの外部プラグインが利用できるかは実行環境に依存します。namagameComment プラグインは、ニコニコ生放送のほか akashic serve コマンドで利用できます。 (参照: #動作確認)
game.json の編集
game.json に
environment.external.namagameCommentプロパティを追加してください。 値は現在のところ"0"とする必要があります。これによりゲーム内で
g.game.external.namagameCommentを利用できるようになります。コメントを処理するハンドラの登録
コメントはゲームに対して
g.MessageEventとして送られます。 シーン (g.Scene) のonMessageトリガーにハンドラを登録して、ゲームに必要な形でコメントを処理してください。以下は、受信したコメントの情報をコンソールに出力するだけのコード例です。
コメントを通知するイベントは「
data.typeプロパティが"namagame:comment"であるg.MessaveEvent」として通知されます。data.commentsにコメント情報が配列で格納されています。このコード例ではコメント情報のうち、コメント本文 (
commentプロパティ) と 「匿名コメントであるかどうか」のフラグ (isAnonymousプロパティ) を利用しています。 (他のプロパティについては 後述)TIP
大量のコメントを受信する際の通信量を減らすため、
commentsは配列になっています。 上のコード例では for-of 文で単純にすべてのコメント情報を順に処理しています。 頻度が高くなければ、コメントは一つずつ (長さ 1 の配列で)MessageEventとして通知されます。受信開始
受信開始は namagameComment プラグインの
start()メソッドで行います。?.を使っていることに注意してください。これはこのプラグインが、ニコニコ生放送のサーバ上の (視聴者に対応しない) 特殊なインスタンスにしか存在しないためです。 その一箇所で呼び出しさえすれば、マルチプレイの全員がコメント通知イベントを受信できるようになっています。 そのため
?.を使うなどして「プラグインがある環境ではstart()を呼び出し、ない環境では何もしないでおく」必要があります。TIP: ?. 演算子のサポート
?.(optional chaining) 演算子は、akashic-cli@3.0.0以降で利用できるようになりました。 (参考: ニコ生ゲームを作ろう » ECMAScript のバージョン (JavaScript で利用できる機能) について)以前のバージョンでは、if 文などを使って書く必要があります。
ただし、いずれにせよ akashic serve でコメント機能を動作確認するには、後述のとおり
3.0.7(予定) 以降のakashic-cliが必要です。バージョンが古い場合はnpm install -g @akahsic/akashic-cliを実行して、最新に更新することをおすすめします。受信停止
コメントが必要なくなった時には、
stop()メソッドで受信を停止してください。動作確認
akashic serveコマンドで、namagameComment プラグインを含む動作確認が可能です。akashic serve上では次の方法でコメントを送信でき、またゲーム内で受信できます。INFO
これらの機能は
akashic-cli@3.0.10以降で利用可能です。serve の UI (ブラウザ画面) からの送信
akashic serve の開発者ツール、 Niconico タブでコメントを送信できます。
開発者ツールの Niconico タブで、画面左側から "Comment" を選択すると、以下の UI が表示されます。
TIP
画面下側の開発者ツール (devtool) 部分は、画面右上のハンバーガーボタン (
) を押すと表示されます。
コメント入力欄では、コメント本文とコマンドとして任意の文字列を指定できます。 "Send" ボタンを押すと、送信者タイプ (Anonymous, Named, Broadcaster) に応じた内容でコメントが送信されます。
タイプ
isAnonymousをtrue、userIDをランダムな文字列にするisAnonymousをfalseに、userIDをそのウィンドウのプレイヤー ID にするisAnonymousをfalseに、userIDとvposをundefinedにするTIP 放送者コメントの確認
serve が
--target-service nicolive(または-s nicolive) で起動されている場合、 最初に開かれたウィンドウが放送者役として扱われます (詳細)。 このウィンドウの送信者タイプは Broadcaster に固定されます。 また他のウィンドウでは Broadcaster を選択できなくなります。INFO
Comment の画面は、 game.json の
environment.external.namagameCommentフィールドがあるゲームでのみ有効になります。テンプレートからの送信
動作確認中に都度入力する手間を省くため、事前にコメントのテンプレートを作成しておくことができます。
テンプレートの設定がある場合、コメント入力欄の上に "Template" 列が表示されます。 この列のボタン押下で指定したコメント (複数可) を送信できます。
テンプレートは、 sandbox.config.js の
external.namagameComment.templatesフィールドで指定します。TIP sandbox.config.js
sandbox.config.js は akashic serve/sandbox コマンドの設定ファイルです。 game.json のあるディレクトリにこの名前のファイルを置くと、起動時に自動的に認識されます。 詳細は リファレンス » 設定ファイル » sandbox.config.js の仕様 を参照してください。
次の例は、「あいうえお」というコメントが 3 度送られるテンプレート "あいうえおx3" を記載した sandbox.config.js です。
commentsの各要素には、コメント情報に存在するフィールドをすべて指定できます (参考: #コメント通知イベント) 。 さらにframeプロパティで、送信開始から何フレーム後に送信するかも指定できます (指定しなければ直前のコメントと同時に送られます) 。そのほかテンプレートでは、特定タイミングでの自動送信も指定できます。 詳細は #コメントテンプレート の節を参照してください。
仕様
このページの以下の部分は、各 API やデータの仕様をまとめています。
プラグインAPI
namagameComment プラグインは、
start(),stop()の 2 つのメソッドを持ちます。WARNING
このプラグインはインスタンスによって存在しない場合があります。 各メソッドは
?.演算子などを使って、常に存在を確認してから呼び出してください 。start()
start()はコメントの受信を開始します。引数
optsはコメント受信のオプション、callbackは完了時に呼び出されるコールバックです。 ただしどちらも省略できます。第一引数
optsは将来の拡張に備えたもので、現在のところ未使用です。 (型定義上はnullや{}を渡せるようになっています)第二引数
callbackは、start()の完了時に呼び出される関数です。 呼び出しの際、以下の引数が与えられます。err)Errorまたはnullnull。失敗した場合、対応する
Error。完了を待つ必要がなく、エラーに対して行う処理がない場合は、
callbackを省略することができます。start()の戻り値はundefinedです。stop()
stop()はコメントの受信を停止します。引数はありません。戻り値は
undefinedです。コメント通知イベント
配信上のコメントは、 コメント通知イベント としてゲームに与えられます。 コメント通知イベントは、次の条件を満たすイベント
evです。g.MessageEventであるev.player.id(送信者) が":akashic"であるev.dataが次の要素を持つオブジェクトであるtype"namagame:comment"という文字列commentsg.MessageEventのdata.typeを確認することで、そのイベントがコメント通知イベントかどうか判別することができます。TIP
dataプロパティはundefinedやnullでもありうることに注意してください。dataがnullなどでも動作する形で判定を行う必要があります。コメント通知イベントの
commentsは、コメント情報の配列です。 コメント情報 は、次のプロパティを持つオブジェクトです。commentstringcommandstringまたはundefinedundefined。userIDstringまたはundefinedundefined。isAnonymousbooleanfalse。vposnumberまたはundefinedundefined。TIP コメントの分類
すなわちコメントは次のようなコードで振り分けることができます。
注意: userID とプレイヤー ID
コメント情報の
userIDは、ゲーム内のプレイヤー ID (g.game.selfIdや、イベントのplayer.idプロパティで得られる値) と比較することができます。しかしニコニコ生放送のコメントは、デフォルトでは匿名 (「なふだ機能」が OFF) になっています (参考: なふだ機能とは) 。 少なくないコメントにおいて
userIDが匿名化された値になっている可能性が高く、 コメントの送信者とゲームのプレイヤーを紐づけることは必ずしもできない 点に注意してください (放送者コメントを除き) 。「ゲームに参加しているプレイヤーのコメント」を特に識別したい場合は、 「ゲーム内で "なふだ機能" を ON にするよう求める」 「メインゲーム開始前にプレイヤーにテストコメントを送信させて確認する」など、ゲーム側での対応が必要になります。
補足: vpos と受信順
ゲームがコメント通知イベントを 受信する順 は、vpos の値と厳密に対応する保証はありません。 いくらか前後する可能性があります。
コメントリスト (配信画面のコメント一覧) の表示順にできるだけ合わせて順序を判定したい場合は、
vposの値で比較してください。 ただしvposで比較してもなお、センチ秒 (1/100 秒) 単位で同一時刻のコメントの順序は保証されません。 そもそも放送者コメントはvposが与えられないこともあり、コメントリストの表示順を完全に再現することはできないものとして扱ってください。コメントテンプレート
sandbox.config.js の
external.namagameComment.templatesは、コメントテンプレートのテーブルです。 存在する場合、templatesはオブジェクトでなければなりません。templatesの各キーはテンプレート名、値は対応するコメントテンプレートです。コメントテンプレートは、次の要素を持つオブジェクトです。
commentsstartBy"playStart","pluginStart",または
"manual"省略された場合、
"manual"。commentsはコメント内容を指定するオブジェクトの配列です。その各要素は次のプロパティを持ちます。comment,command,userID,isAnonymous,vposframenumber値の解釈は
startByによって決まる。省略された場合、この要素が配列の最初の要素なら
0、それ以外は直前の要素のそれと同値。startByは自動送信の有無・タイミングを指定します。値は次のいずれかです。startBy送信
frameの解釈 (送信タイミング)"playStart""pluginStart"start()呼び出しからの経過フレーム数。"manual"TIP
startByの指定に関わらず、全てのコメントテンプレートは serve の UI からボタンで送信できます。次のコードは、三種類のコメントテンプレートを定義した sandbox.config.js の例です。