AI NPC:AIが動かすノンプレイヤーキャラクターの仕組み(そしてその作り方)
自分だけのAI NPCを作る
人工知能によるNPCは、話し、記憶し、反応します。AI NPCの仕組みを学び、一文で作って、歩ける3Dの世界に置いてみましょう。
AI NPCとは、会話と意図が実行時に言語モデルによって生成されるノンプレイヤーキャラクターのことで、一方で移動と衝突判定は決定論的な経路上にとどまります。AIはキャラクターが何を話し、何を望むかを動かし、エンジンは体がどこへ向かうかを動かします。Neta Studioでは、一文でキャラクターを描写すると、Agent Sprite Forgeがローポリのコンポーネントを生成し、そのコンポーネントがThree.jsで構築された歩ける3Dの世界にそのまま置かれます。
この分離は重要です。なぜなら、バグがどこに潜んでいるかを教えてくれるからです。NPCが壁を通り抜けるなら、経路探索が間違っています。NPCが促されてもいないのにプレイヤーを侮辱するなら、プロンプトの契約が間違っています。このページでは二つ目のカテゴリーを扱います。AI NPCのシステムがどのようにセリフを生成し、性格のパラメーターを保持し、セッションを記憶し、そしてモデルが計画してもエンジンが実行できないときにどう失敗するのかを見ていきます。
簡潔な答え:AI NPCとは実際に何か
この語句を分解しましょう。ここでの「AI」は、モデルがテキストと高レベルの意図を生成することを意味します。「NPC」は、キャラクターコントローラー、コライダー、そしてアニメーションのステートマシンを意味します。この二つは異なる時計で動きます。モデルは数百ミリ秒で応答し、コントローラーは毎フレーム60ヘルツで更新されます。両者は細いインターフェースを通じて会話します。通常は、コントローラーが問い合わせる小さなJSONオブジェクトです。
実際には、このインターフェースは次のようになります。モデルは{line, intent, target}を返します。コントローラーはintentを読み、targetがナビメッシュ上で到達可能かどうかを確認し、対応するアニメーションでセリフを再生するか、代替のセリフに差し替えます。この二つの層を統合してしまうと、モデルが生成を終えるまでNPCがワープしたり、滑ったり、セリフの途中で立ち尽くしたりすることになります。
したがって実用的な定義はこうです。AI NPCとは、発話の出力と次の行動の選択が生成モデルから来るNPCであり、エンジンが実際に実行できる固定の合法な意図の集合によって制限されたものです。
- 対話の層モデル呼び出し。レイテンシは200〜900ミリ秒。失敗したり、レート制限に達したり、不正なJSONを返したりすることがあります。
- 意図の層短い列挙型:greet、follow、flee、trade、attack、idle。列挙型の外にあるものはすべて破棄されます。
- 移動の層ナビメッシュの経路探索、コライダー、アニメーションのブレンド。毎フレーム実行されます。モデルは呼び出しません。
- 記憶の層NPCが想起を許可されている事実のキーと値の保存領域で、トークン予算によって上限が設けられます。
ルールベースのNPCとAI駆動のNPC
ルールベースのNPCは表から選びます。状態、遷移、セリフをすべて手で書きます。正確で、安価で、再現可能です。同じ入力は常に同じ出力を生むので、テストもデバッグも簡単です。天井はあなたの執筆時間であり、失敗の形は、プレイヤーが予想していなかったことを入力して、無表情な反応を受け取ることにあります。
AI駆動のNPCはセリフを生成します。あなたは契約と合法な意図の集合を書き、モデルがその間の空間を埋めます。予想外の入力もうまく扱いますが、同じ入力でも二回の実行で異なる出力を生むことがあり、単純なリプレイテストを壊します。コストはキャラクター数ではなく会話の長さに比例して増えるので、おしゃべりなシーンは静かなシーンより高くつきます。
どちらかが厳密に優れているわけではありません。正直な比較はこちらです:
| 観点 | ルールベースのNPC | AI駆動のNPC |
|---|---|---|
| 振る舞いの源 | 手書きのステートマシンとセリフ表 | 意図の列挙型によって制限されたモデル出力 |
| リプレイ再現性 | 実行間でビット単位まで同一 | シードと温度を固定しない限り非決定的 |
| コストの形 | ビルド時に固定 | 実行時はトークン単位で、会話の長さに応じて増加 |
| デバッグのしやすさ | 遷移を追跡する。ログがコードそのもの | プロンプト、生の応答、解析された意図、フォールバックを別々に記録する |
| 失敗の形 | 空の応答、または誤った分岐の応答 | 契約外のセリフ、レイテンシの急増、または解析不能なJSON |
| 制作の手間 | セリフごとは多いが、状態ごとは少ない | セリフごとは少ないが、制約ごとは多い |
動的な対話
対話ツリーは、手書きのノードを持つグラフです。書き手が一語一語を制御できるため、クエストや契約、物語上重要な明かしは今でもツリーを使います。プレイヤーの入力はN個の分岐のいずかに照合され、Nの外にあるものは扱われません。ツリーは内容に比例して直線的に増えます。会話が二倍になれば、執筆量も二倍になります。
生成される対話は、量だけでなく種類そのものが違います。モデルはプレイヤーの実際の文に加えて、あなたが注入する文脈——NPCの名前、現在の目標、直近三回のやり取り——を読み、それに合う応答を書きます。予想もしなかった質問にも対応できます。そしてその質問に、自信満々に、キャラクターになりきって、ひどく対応することもできます。これは失敗よりも厄介です。
ツリーが依然として正しいのはどこか。ゲームの残りが依存する状態を運ぶセリフです。「門の暗証番号は4417だ。」これをモデルに発明させてはいけません。信頼できるパターンはハイブリッドです。ツリーが事実と分岐点を担い、モデルが言い回しと世間話を担います。Neta Studioでは、説明からAI NPCを構築すると、生成されたコンポーネントが意図の列挙型を公開します。保証したい事実は、指示としてプロンプトに入れるのではなく、固定の文字列としてコンポーネントに入れます。
プレイヤーとの接触に耐えるプロンプトの形
システムプロンプトはおよそ300トークン以下に抑えます。役割、口調、三つの制約、そして出力のスキーマです。それ以外——持ち物、クエストの状態、世界の事実——は、エンジンがターンごとに注入する別の文脈ブロックに入れます。世界のすべてをシステムプロンプトに入れると、レイテンシが上がり、モデルは後半の指示を無視し始めます。
常に構造化された出力を要求します。lineとintentを持つJSONオブジェクトを求めます。それを解析します。解析に失敗したら、そのセリフを捨ててフォールバックを再生します。長さのチェックなしに、生のモデルのテキストを対話ボックスに直接描画してはいけません。暴走した生成は400語の独白を生み、あなたの画面を壊します。
手続き的に生まれる性格
性格は、背景設定の段落ではありません。背景設定の段落はモデルの想像力のための訓練データであり、長くなるほど劣化します。数百語を超えると、モデルはそれを味付けとして扱い始め、ありきたりな親切さへと漂流します。代わりに、性格を三つか四つのパラメーターとして扱いましょう。それぞれが観察できる振る舞いを変えるものです。
目標は、NPCが今この瞬間に望んでいることです。口調は、どう話すか——そっけなく、格式ばって、あざけるように。制約は、何をしないか——嘘をつかない、戦争の話をしない、取引をしない。この三つはプロンプト一行に収まり、個別にテストできます。四つ目を足すのは、それを変えたときに何が変わるかを説明できる場合だけにしましょう。
Neta Studioでは、Agent Sprite Forgeが説明を受け取り、これらのパラメーターをコンポーネント上のフィールドとして公開したローポリのコンポーネントを返します。モデルのプロンプトに触れずに目標を編集でき、コンポーネントを複製して口調だけを変えれば二体目のNPCが得られます。同じメッシュで口調だけが違う二体のNPCは、シーンの中では別々のキャラクターとして読まれます。これは二つのスプライトを書くよりも安く済みます。
- 目標一文、現在形。「プレイヤーを祠から立ち去らせる。」
- 口調二つから四つの形容詞。「そっけなく、古風で、短気。」
- 制約否定のルール。「川の名を決して口にしない。品物を決して受け取らない。」
- 知識の境界NPCが参照できるもの。その外にあるものは、発明ではなく、キャラクターらしいはぐらかしを生むべきです。
適応する振る舞い
セッション内の記憶は安価で効果的です。直近N回のやり取りのローリングバッファに加えて、NPCが伝えられた事実の小さなキーと値の保存領域を保ちます。Nは8から12でほとんどのシーンに機能します。それを超えると、プロンプトはプレイヤーの忍耐より速く膨らみ、古いターンはそもそも出力に影響しなくなります。
NPCが確実に記憶できるもの:述べられた通りのプレイヤーの名前、特定の品物が渡されたか拒まれたか、以前のやり取りが敵意で終わったかどうか、そして最後に述べられた目標。確実に記憶できないもの:二十ターン前の正確な言い回し、キーと値の保存領域に一度も書かれなかった事実、そして永続化しない限りページの再読み込みをまたぐあらゆるもの。プロンプトの中だけに生きる記憶は、蒸発する記憶です。
反応は後半です。エンジンは状態の変化——体力の低下、品物の受け渡し、距離のしきい値の超過——を監視し、イベントをNPCの文脈に押し込みます。するとモデルは列挙型から意図を選びます。これが意図の列挙型が存在する理由です。モデルが提案し、エンジンが処分します。攻撃を「決断」したNPCも、到達可能性のチェックを通過しなければなりません。失敗すれば、警告のセリフを再生してその場にとどまります。
永続化に実際にかかるコスト
記憶をストレージに書き込むのは、一行のコードと一つのスキーマの決定です。キーは短く平坦に保ちます:playerName、gaveItem、hostility。入れ子のオブジェクトは肥大化して腐ります。スキーマは最初から版管理しましょう。後からの名前変更は、移行を書かない限り、古いセーブを静かに破棄します。
セッションをまたぐときは、会話履歴の全体を文脈に再投入しようとしてはいけません。高くつき、NPCを繰り返しがちにします。要約——三つから五つの事実——を永続化し、文字起こしは新しく始めます。
一文でAI NPCを作る
Neta Studioのパイプラインは意図的に短くできています。あなたは説明を書きます。Agent Sprite Forgeが、メッシュ、パレット、振る舞いモードを備えたローポリのコンポーネントを生成します。それを3Dゲームビルダーで構築した歩けるシーンに置くと、衝突判定、経路探索、対話のフックがすでに配線された状態で出現します。
機能する説明は、役割、口調、そして一つの制約について具体的です。「疑い深い灯台守。そっけなく、北方出身。難破について決して語らない。」これにより、まさにその三つのパラメーターをプロンプトに含むコンポーネントが生まれます。「かっこいいキャラクター」のようなものは、制約するものが何もないため、ありきたりな結果を生みます。
結果は二か所でテストできます。長編の歩けるシーンであるThe Cyclops' Islandと、より小さく素早く反復できるMini Worldです。どちらもブラウザ上でThree.jsで動作します。コンポーネントを置き、そこまで歩いて行き、一行を入力し、応答を読みます。口調がずれているなら、プロンプトを一から書き直すのではなく、コンポーネントの口調フィールドを編集しましょう。
01
一文を書く:役割、口調、一つの制約。
02
それをAgent Sprite Forgeに通して、ローポリのコンポーネントを生成する。
03
3DゲームビルダーでMini WorldまたはThe Cyclops' Islandを開く。
04
コンポーネントをシーンに置く。衝突判定と対話のフックを備えて出現する。
05
歩み寄って一行を入力する。応答と、それが選んだ意図を読む。
06
システムプロンプトではなく、コンポーネント上の口調や制約を編集する。
07
失敗の経路をテストする:的外れなことを入力し、フォールバックが発動することを確認する。
08
正しく振る舞うようになったら、コンポーネントをより大きなシーンへ移す。
AI NPCにまだできないこと
長期的な計画は機能しません。シーン全体で三十の段階を計画するよう求められたモデルは、もっともらしい計画を生み、そして六番目の段階までに筋を見失います。なぜなら、段階の間で状態を保つものがプロンプト以外に何もなく、プロンプトは長く、雑になっていくからです。多段階のクエストが必要なら、段階を書き、モデルには各段階の中で対話を埋めさせましょう。物語の弧を保持するよう求めてはいけません。
真に開かれた目標も機能しません。「好きにやれ」は、麻痺か、ありきたりな親切のループのどちらかを生みます。なぜなら、モデルには何が進歩と見なされるかの手がかりが何もないからです。目標は、エンジンがそれが達成されたかどうかを確認できる場合にのみ使えます。そのチェックを書けないなら、あなたが持っているのは目標ではなく、気分です。
コスト管理こそが本当の空白です。ターンごとのコストは小さく、失敗は終わらない会話にあります。話し続けるプレイヤーは請求を積み上げ続けます。やり取りごとのターンの厳格な上限、文脈トークンの上限、そして劣化の経路が必要です。上限に達したら、NPCはより短い定型の応答に切り替わります。この三つがなければ、好奇心旺盛なテスター一人が、あなたのシーンの残り全部を合わせたよりも多くの予算を燃やしかねません。
そして、より小さな失敗もあります。およそ1.5秒を超えるレイテンシは、思慮深いキャラクターではなく、壊れたゲームとして読まれます。非決定性は、シードと温度を固定しない限りリプレイテストを壊します。そして、生成されたどのセリフも、ツリーがすでに確立した何かと矛盾し得ます。だからこそ、事実はツリーにとどまります。
- 計画の視野一段階から二段階なら信頼できる。それを超えるとひどく劣化する。
- 目標の検証エンジンが確認できなければならない。そうでなければ目標は飾りになる。
- コストの上限やり取りごとのターン上限に加えて、トークン上限、そしてフォールバックモードが必要。
- レイテンシの予算会話らしさには1.5秒未満。それを超えると、プレイヤーはフリーズだと考える。
- 決定性既定では非決定的。リプレイでテストするなら、シードと温度を固定する。
それが属する世界へ歩き出そう
スプライトは、立つ場所を持たないキャラクターです。最後の一歩は、他ならぬ誰も提供していないものです。今作ったシートを、誰かが歩き回れる世界——小さな島、惑星、雨の街角——に置くのです。このサイトのすべての世界は、一つの書かれた説明から作られ、遊べるページとして公開されています。
FAQ
NPCはAIですか? +
伝統的には、いいえ。古典的なNPCは、手書きのセリフを持つステートマシンであり、それは今でもほとんどの出荷済みゲームで既定です。「AI NPC」という語は、対話や意図の選択が表から選ばれるのではなく、実行時にモデルによって生成されるキャラクターを特に指します。
AI NPCとは何ですか? +
発話の出力と次の行動の選択が生成モデルから来るノンプレイヤーキャラクターで、エンジンが実行できる固定の意図の集合によって制限されます。移動、衝突、アニメーションは決定論的にとどまり、モデルは対話を埋めて意図を提案するだけです。
AI NPCは物事を記憶できますか? +
セッション内では、はい——直近8回から12回のやり取りのローリングバッファと、事実の小さなキーと値の保存領域で、ほとんどのシーンをまかなえます。ページの再読み込みをまたぐには、事実をストレージに永続化した場合に限ります。プロンプトの中だけに生きる記憶は、文脈が消えるとともに消えます。
無料で作れますか? +
Agent Sprite Forgeと3Dゲームビルダーはブラウザ上で動作し、ローカルのツールチェーンなしで、一文からコンポーネントを生成できます。コストを伴うのは実行時のモデル呼び出しの部分であり、そのコストはどのモデルに振り分けるか、会話がどれだけ長く続くかによって変わります。
AI NPCを作るにはゲームエンジンが必要ですか? +
ブラウザのシーンなら必要ありません。3DゲームビルダーがThree.js上での描画を担い、生成されたコンポーネントに衝突判定、経路探索、対話のフックを与えるので、エンジンのセットアップ工程を省けます。完全なエンジンが必要なのは、ネイティブビルドを対象にする場合だけです。
AI NPCはブラウザで動きますか? +
はい。モデル呼び出しはネットワーク要求で、描画はWebGLなので、どちらもブラウザ上で動きます。実用上の制約はレイテンシです。システムプロンプトを短く、文脈ブロックを別に保ちましょう。そうしないと、プレイヤーがゲームはフリーズしたと思い込んだ後に応答が届き始めます。
AI NPCの運用にはいくらかかりますか? +
配置するキャラクターの数ではなく、会話の長さに比例して増えます。静かなNPCはほぼ無料で、おしゃべりなNPCはターンごとに課金されます。重要な制御は、やり取りごとの厳格なターン上限とトークン上限で、上限に達したら定型の応答にフォールバックします。
3Dゲームビルダーに戻る
完成した31の3D世界、ゲーム、シーンはすべて一つのページに——そのどれもが遊べます。