NarraLeaf

エージェントでゲームを作る

台本と素材のフォルダーからビルド済みのゲームまで、エージェントが途中で何をするか、そしてそれをどう見守り、どう割り込むか

この手順は、エージェントが接続済みで、スキルまたはガイドを持っていることを前提にしています。エージェントを接続するを参照してください。

台本と素材を用意する

台本をテキストファイルに、画像と音声を 1 つのフォルダーにまとめます。設定 → エージェント連携でエージェントによる変更を許可をオンにし、そのフォルダーを素材を読み込めるフォルダーに追加します。追加しなかった場合は、エージェントが初めてそのフォルダーを読み取るときに Studio が許可するかどうかを尋ねます。

立ち絵の背景は透明である必要があります。不透明な立ち絵は四角形として表示されます。Studio が読み込める形式は次のとおりです。

種類形式
画像PNG、JPEG、WebP、GIF、AVIF、SVG
音声MP3、OGG、Opus、WAV、M4A、AAC、FLAC
動画WebM、MP4(H.264)
フォントTTF、OTF、WOFF、WOFF2

足りない画像があっても作業は止まりません。エージェントがキャプション付きの仮画像を作り、そのことを伝えます。

パーツに分かれた素材、つまり PSD や、mei_body.png、mei_eyes_smile.png のようにレイヤーとタグごとに 1 枚ずつの画像は、レイヤー立ち絵のキャラクターになります。ボイスの収録音声も同じフォルダーに置けます。翻訳とボイスを参照してください。

作りたいものを伝える

たとえば次のように伝えます。

~/Documents/my-novel/script.txt の台本と ~/Documents/my-novel/art の素材でビジュアルノベルを作って。テキストは日本語、1920x1080、エンディングは 2 つ。

MCP のプロンプトを表示するクライアントでは、make_game プロンプトでも同じ作業が始まります。

要件を確認する

エージェントはまず接続を確認し、それから短い要件確認を作者と一緒に行います。タイトル、テキストの言語、解像度、絵柄、キャラクター、エンディング、手元にある素材です。台本を渡された場合は、見つけたシーン、話者、素材に加え、ファイルのない台本上の参照と、台本で使われないファイルを一覧にします。作者がその一覧を認めるまで、プロジェクトには手を付けません。

作業を任せる

作業の順序はスキルが決めています。

段階エージェントがすること
接続セッションの状態を読む。開いているプロジェクト、変更できるか、どのフォルダーから読み込めるか
要件作るものを確認する。前の手順のとおり
プロジェクトスケルトンテンプレートからプロジェクトを作るか既存のものを開き、テンプレートのサンプルを再利用する。空のテンプレートから作ったプロジェクトには、スケルトンの動作する画面を導入する。文字速度やオート送りの間隔など、新しいプレイヤーの設定の初期値を決める
素材作者のファイルをストーリーで扱いやすい名前で読み込み、足りないものには仮画像を作る。読み込み済みのファイルと同一のファイルは二重に読み込まない
キャラクターと変数キャラクターのポーズまたはレイヤー立ち絵、名前の色、アバターと、ストーリーに必要な変数を設定する
ストーリー1 回の呼び出しで 1 シーンずつ分岐も含めて書き、タイトルのスタートボタンを最初のシーンにつなぐ
インターフェース配色とフォントを決めてから各ページの見た目を整え、1 回ごとにスクリーンショットを確認する。Gallery のツールで鑑賞画面を埋める
インタラクションテンプレートにない動作にだけブループリントを追加する。たとえば CG の解除や、ストーリーの行での実績の付与
検証エラーがなくなるまでチェックを実行し、ルートとエンディングのテストを行い、すべてのルートをエンディングまでプレイし、つないだり見た目を変えたりしたボタンを実行中のゲームですべて押す
翻訳とボイス頼まれたときだけ行う。指定された言語にゲームを翻訳し、ボイスの収録音声をセリフにリンクする
仕上げゲームをビルドし、作ったものと作者に残る作業を報告する

引き継ぐ

エージェントは最後に報告を出します。作ったシーン、ルート、エンディング、ゲームに残っている仮画像、翻訳とボイスの言語ごとの進み具合、作者に残る作業、開くべきビルド済みファイルです。プロジェクトは Studio で開いたままなので、そのまま編集を続けることも、エージェントに追加を頼むこともできます。

鑑賞画面

プロジェクトが Gallery プラグインを使っている場合(スケルトンテンプレートは使っています)、エージェントはプラグイン自身のツールで鑑賞画面を埋めます。まずプラグインのガイドの章を読み、それからすべての CG とその差分、主要なシーンごとの回想、サウンドトラック、ボイスがあればボイスを追加します。鑑賞画面はカタログの内容をそのまま表示するので、一覧に出すための新しいブループリントは要りません。

回想、音楽、ボイスは自動で解除されます。プレイヤーがシーンに到達したとき、曲が流れたとき、台詞が読まれたときです。CG はそうではありません。Unlock Gallery ノードが必要です。ガイドはエージェントに 2 つの実行方法を示しています。

  • CG が表示される行で。 ストーリーの行が自分のブループリントを実行し、それが Unlock Gallery を呼びます。プレイヤーが CG を見た瞬間に解除されます。
  • タイトルページから。 その瞬間を変数で記録したほうがよい場合、たとえば複数の CG やルートが 1 つのフラグを共有する場合です。
    1. CG ごとに永続変数を 1 つ作ります。たとえば seen_cg_rooftop で、既定値は false です。
    2. シーンの中で CG が表示された直後の行に、それを true にする /set を置きます。
    3. タイトルページの開始イベントで変数を読み、true ならその項目に対して Unlock Gallery を実行します。タイトルは起動時とクリアのたびに開くので、そこから入る鑑賞画面は常に最新の状態です。

ツールはプラグインのツールにあります。

レイヤー立ち絵のキャラクター

キャラクターの素材がパーツに分かれている場合、エージェントはポーズごとに 1 枚の画像ではなく、レイヤー立ち絵のキャラクターを作ります。表情を変えると眉、目、口がまとめて変わり、衣装はそのまま残ります。レイヤー立ち絵についてはキャラクターを参照してください。作り方は 2 つあります。

  • レイヤーとタグで名付けた画像から。 パーツを、常に描くレイヤーは <character>_<layer>、変化するレイヤーの 1 つのタグは <character>_<layer>_<tag> という名前で読み込みます。たとえば mei_body、mei_eyes_smile、mei_outfit_casual です。そのうえで、レイヤーの重なり順と、一緒に変わるレイヤー(たとえば 1 つの expression 軸に属する眉、目、口)を指定します。
  • PSD から。 2 つ以上のレイヤーを含む最上位のグループがそれぞれ軸になり、中のレイヤーがその軸のタグになります。それ以外のレイヤーは常に描かれます。各レイヤーはキャンバス全体の大きさで書き出され、アセットとして読み込まれます。非表示のレイヤーは含まれません。乗算やスクリーンなど、ステージで描けない描画モードのレイヤーは、下のレイヤーに統合するか省きます。判断がつかないとき、エージェントは作者に尋ねます。

レイヤーの画像はすべてキャンバス全体の大きさで、パーツ以外の部分が透明である必要があります。そうでなければ Studio は拒否し、各画像の大きさを示します。エージェントは、組み合わせを使うシーンを書く前に、その見た目をプレビューで確認します。

既存のキャラクターをレイヤー立ち絵に、またはレイヤー立ち絵からポーズに切り替えると、今の見た目はすべて失われ、それを選んでいたストーリーの行は既定の見た目に戻ります。エージェントが確認するまで Studio はこの切り替えを拒否し、スキルは影響を受ける行を作者に示して先に了承を得るようエージェントに指示しています。

Live2D と Spine のキャラクターは、作者がキャラクターエディタで設定します。エージェントはそれを読み取り、モデルが持つ名前を使って、動かすための行を書きます。

アバター

ダイアログのアバターは、ダイアログとバックログでセリフの横に表示される顔の画像です。エージェントはキャラクターと一緒にアバターを設定します。より具体的なものがない場所に表示される既定のアバター(画面にいないキャラクターのセリフやバックログも含む)と、ポーズごとのアバター、レイヤー立ち絵の場合はアバターが従う軸の組み合わせごとのアバターです。多くは衣装にかかわらず表情ごとに 1 枚です。エージェントが何も設定しなければ、作者がキャラクターパネルを開いたときに Studio が立ち絵からアバターを切り出します。エージェントはそのことを報告で伝えます。

翻訳とボイス

エージェントがこの 2 つを行うのは、頼まれたときだけ、しかもストーリーが固まってからです。その後にセリフを直すたびに、その翻訳と収録音声は古くなるからです。

翻訳

エージェントはまず言語をプロジェクトに追加し、名前から訳して作者と用語集を決めます。次にインターフェースと名前付きキー、最後にストーリーをシーンごとに訳します。対象は、ストーリーのセリフ、キャラクター・シーン・エンディングの名前、インターフェースのテキスト、名前付きの翻訳キー、プラグインが翻訳用に提供するテキストです。

  • ゲームが実行時に埋める値({0} など)と、装飾した語や間を囲むタグは保たれます。これらを失った翻訳も書き込まれますが、エージェントに知らされ、その行を送り直します。
  • 各まとまりには、エージェントが読み取ったときの各行のリビジョンが付きます。その間に作者が編集した行は飛ばされ、新しい原文とともにエージェントに返されます。
  • エージェントが書いた翻訳は機械翻訳として記録されます。翻訳の表の確認モードで確認してください。エージェントが翻訳済みや確認済みにするのは、作者がそう指示したときだけです。
  • 各まとまりは、行数にかかわらず 1 ステップの取り消しになります。エージェントの編集を追うがオンなら、Studio はその言語の翻訳の表を開きます。

翻訳そのものについてはローカライゼーションを参照してください。

ボイス

Studio は収録を行いません。エージェントは、手元にある収録音声を対応するセリフにリンクします。

  1. ボイスの言語を設定します。ボイスの言語はテキストの言語とは別で、英語で読み、日本語で聞くゲームも作れます。
  2. 収録ファイル名のパターンに従って、ボイス付きの各セリフの想定ファイル名を一覧にします。既定は {scene}_{index}_{character} で、シーン名、そのシーンのボイス付きセリフの中での番号(001、002…)、話者です。一覧は収録する人に渡せます。ファイルはこのパターンで照合されるので、別のパターンにするなら収録の前に変えてください。
  3. 収録音声を 1 つのアセットフォルダーに読み込み、各セリフを、ライブラリ上の名前が想定ファイル名と一致するアセットにリンクします。大文字と小文字、空白、句読点、拡張子、フォルダーは無視されるので、Opening_001_Aoi.ogg も opening 001 aoi.wav も一致します。2 つのアセットや 2 つのセリフが同じ名前を共有する場合は、推測しません。
  4. 残りを 1 つずつリンクし、収録音声がまだないセリフを一覧にします。

新しくリンクした音声は収録済みと表示されます。エージェントが承認済みにするのは、作者が聞いて確認したと言ったときだけです。照合はライブラリ上の名前で行うので、名前を間違えた音声はアセットの名前を変えれば直ります。音声をリンクする呼び出しは 1 回ごとに 1 ステップの取り消しになり、エージェントの編集を追うがオンなら、Studio はその言語のボイスの表を開きます。

Ren'Py のゲームを移植する

省略可能な narraleaf-port-renpy スキルは、既存の Ren'Py のゲームを Studio に移す作業をエージェントに案内します。対象はソースのあるゲーム、つまり .rpy スクリプトの入った game フォルダーがあるものです。narraleaf-make-game を土台にしているので、両方を入れます。エージェントを接続するを参照してください。

  • 手作業ではなく変換プログラムで。 エージェントは、スクリプトを一度読み込んで各シーンの .story テキストを生成するプログラムを書きます。対応づけが誤っていたとわかれば、変換プログラムを直してシーンを生成し直します。
  • Ren'Py から Studio への対応づけ。 Ren'Py の文、画像の属性、位置と変形、キャラクター、変数と永続データ、メニュー、エンディングをどう移すか、どのメディアを読み込む前に変換するかを、スキルが定めています。
  • 実行中のゲームからインターフェースをなぞる。 エージェントは Ren'Py のゲームを実行してすべての画面のスクリーンショットを撮り、それぞれを画像と見比べながら Studio で作り直し、Studio で実行したゲームでもう一度確かめます。この手順には、コンピューターに Ren'Py SDK が必要です。

エージェントは Ren'Py のソースをその場で読むだけで、変更はしません。途中で作るものは、自分の作業フォルダーに置きます。

エージェントを見守る

追従モード

エージェントの編集を追うがオンのとき、Studio は変更が反映されたエディタを開き、変わった要素や行を一時的に枠で示します。既定でオンで、プロジェクトごとに記憶されます。

追従によって Studio が前面に出ることはないので、ほかのアプリケーションでの入力は妨げられません。Studio のタブで入力している最中は、エージェントのタブはその後ろに開きます。

ステータスバー

エージェントが作業している間、ステータスバーは緑色になります。呼び出しの最中、最後の呼び出しから 15 秒間、そして一時停止している間です。実行中のゲームと実験モードは、それぞれの色のままです。

最初の呼び出しから、ステータスバーにエージェントの様子を示す項目が現れます。

表示意味
エージェントが編集中:…呼び出しが、示されたページやシーンを変更している
エージェントが編集しました:…直前の変更。反映後の数秒間表示される
エージェント:…呼び出しの合間。接続中のクライアントを示す
エージェントは一時停止中再開するまで変更はすべて拒否される

この項目をクリックすると、エージェントを一時停止とエージェントの編集を追うを選べます。

エージェントログ

エージェント → エージェントログは、下部のドックのコンソールの隣にパネルを開きます。1 回の呼び出しが 1 行で、時刻、クライアント、何をしたか、何に対してか、結果、所要時間が表示されます。

  • 絞り込みですべて、変更のみ、失敗のみを切り替えます。
  • 何かを変更した行をクリックすると、その変更箇所が開き、枠で示されます。
  • 拒否された行を開くと、理由と、エージェントに示された対処が表示されます。
  • 書き出す… はログを JSON Lines として保存し、消去はログを空にします。

ログはこのウィンドウの直近 500 回の呼び出しをメモリに保持します。記録するのは作者が見ていれば見えた内容で、呼び出しの引数は記録せず、プロジェクトにも書き込みません。

作業に割り込む

一時停止。 ステータスバーの項目またはエージェントメニューのエージェントを一時停止で、エージェントを再開するまで、このプロジェクトに対するエージェントの変更はすべて拒否されます。読み取りはできるので、エージェントはその間に作者が変えた内容を把握できます。一時停止はそのセッションの間だけ有効で、Studio を再起動すると解除されます。

取り消し。 プロジェクトを変更する呼び出しは 1 回ごとに 1 ステップの取り消しになります。キャラクターの編集も、翻訳やボイスのリンクのひとまとまりも同じです。Ctrl+Z(macOS では Cmd+Z)で、自分の変更と同じようにエージェントの直前の変更を取り消せます。スキルは、取り消された変更を「不要」の意思表示として扱い、もう一度試す前に作者に確認するようエージェントに指示しています。

並行して編集する。 エージェントが作業中のページやシーンを、作者が編集してもかまいません。エージェントの次の書き込みは読み取ったときのリビジョンを伴うので、stale_revision で拒否されます。エージェントは作者の版を読み直し、その上で変更をやり直します。作者の編集が優先されます。

完全に止める。 エージェントによる変更を許可と、オンになっていればフルアクセスをオフにすると、どちらかを再びオンにするまで、すべてのエージェントの変更が拒否されます。エージェントの接続を許可をオフにすると、エンドポイントが停止します。

たいてい残る作業

エージェントは報告でこれらを挙げます。よくあるものは次のとおりです。

  • 背景が不透明な立ち絵。切り抜いた画像を用意するまで四角形のまま表示されます。
  • 提供されなかった素材の代わりの仮画像。
  • Studio で再生できない形式のファイル。変換が必要です。
  • 機械翻訳として記録され、確認を待っている翻訳と、承認を待っているボイス。
  • まだない収録音声。シーンと想定ファイル名ごとに一覧になります。
  • Live2D と Spine のキャラクター。作者がキャラクターエディタで設定します。
  • 残ったサンプルの内容。
  • アプリケーションのアイコンとコード署名。ビルドダイアログの識別情報と署名で設定します。実行とパッケージ化を参照してください。

このページの目次