Kirino 的游戏宝藏
← 第 022 号へ
ゲーム観察

ドメイン言語と生成されたバックトラッキング:Jose Antonio Escribano はいかにし�� Guerrilla 系譜の HTN を、「実行時にパースしない」ゲーム AI プランナーとしてオープンソース化したか

もし現代ゲーム AI の既定文法が、いまだ「ビヘイビアツリーにノードを吊るし、ブラックボードに真偽を書き、`Update()` のなかの一連の if で NPC の高位意図を雰囲気として糊付けする」ことだとしたら、Jose Antonio Escribano(GitHub:urosidoki)が 2026 年 9 月末に公開した…

保存した記事 ↗

もし現代ゲーム AI の既定文法が、いまだ「ビヘイビアツリーにノードを吊るし、ブラックボードに真偽を書き、`Update()` のなかの一連の if で NPC の高位意図を雰囲気として糊付けする」ことだとしたら、Jose Antonio Escribano(GitHub:urosidoki)が 2026 年 9 月末に公開した **htn_planner** は、別の系譜を公衆の前でエンジニアリングの地面に打ち戻す行為に近い。階層タスクネットワーク(Hierarchical Task Network、HTN)は、実行時に解釈されるスクリプト方言である必要はなく、**ドメイン DSL → AST → IR → 生成 C** というコンパイルパイプラインでありうる——ランタイムは生成されたプランナーを直接実行し、プレイ中にドメインソースをパースしない。

この一文はコンパイラのスローガンにも聞こえる。本当に重いのは、著者自身が公開説明で釘付けにした境界だ。それは Guerrilla が『Horizon Zero Dawn』『Horizon Forbidden West』で用いた HTN プランナーの設計と量産経験に着想を得た**独立実装**であり、Guerrilla のプランナーそのものでも、そのソースコードの公開でも**ない**。系譜は敬意を表してよい。著作権と血統は分けなければならない。

本稿を貫くイメージは、「バックトラッキング」という二語そのものである。それは AI 論文の抽象的探索ではなく、制作現場でデバッガが展開する決定木だ——前提が失敗したときどう退くか、メソッド分岐はどう束縛し直すか、遅延分解は更新後のワールドステートに対してどう再展開するか——そしてそのすべてが、次フレームの一時的な真偽ではなく、バージョン付き C ABI に着地すること。

GameFromScratch 記事ヒーロー図:htn_planner と Horizon 文脈

一、既定論理:高位決定はビヘイビアツリーであり、ブラックボードスクリプトであり、実行時インタプリタである

業界の既定論理は潔い。だからこそ怠惰でもある。

NPC が「まず巡回し、警戒し、目標発見後に支援を呼ぶ」といった秒をまたぐ意図を必要とする瞬間、チームは見慣れたメニューを開く。ビヘイビアツリーを吊るし、ブラックボードに `enemyVisible` / `lowHealth` を詰め、デコレータとセレクタで優先度をツリー UI として書き、もう少し「賢く」見せたくなれば GOAP か自作ステートマシンをねじ込む。プレイヤーも制作者も、同じ語彙で NPC を読むようになる——「ツリーが整った」「ボードがきれいだ」「このフレームは考えているように見える」。その暗黙の合意が、「高位決定=実行時にグラフを解釈する」ことを赦される業界文法にしてしまう。

問題はビヘイビアツリーそのものではない。ツリーは実行可能な反応を可視化できる制御流に編むのが得意だ。本当に苦しいのは、決定が**ワールドステート述語**の組み合わせ探索をし、失敗した前提から系統的に後退し、「いま正直に使える局所計画」と「後でこそ展開すべき後続タスク」を切り離さねばならないとき——そしてそれこそが、HTN 系譜が長く引き受けると名乗ってきた仕事である。

Guerrilla の Decima エンジンは、その系譜を AAA の公開演壇まで押し上げた。2024 年 11 月 25 日、Principal AI Programmer の Tim Johan Verweij は Goldsmiths / AI and Games Conference で『HTN Planning in Decima』を発表し、内部実装を硬く述べた。前提条件に対する Prolog 的バックトラッキング、その流れの可視化、それが**生成された C++** にどう実現されるか、そしてゲーム内で HTN 分解をどうデバッグするかに触れる。言い換えれば、AAA 現場の HTN は「もう一層のスクリプトインタプリタ」という浪漫ではなく、「生成コード+デバッグ可能な分解」という制作制度だった。

htn_planner は同じ系譜の公開側に立つ。それが拒むのはビヘイビアツリーではなく、より隠れた既定——NPC の高位意図は実行時パースとブラックボードの雰囲気で永遠に維持でき、コンパイルもホットリロードも ABI の版検査も不要だ、という思い込みである。

二、脚本を砕く:領域を「解釈する」から、ネイティブプランナーを「生成する」へ

Jose の LinkedIn 公開投稿(およそ 2026-09-27)、続く r/gamedev の転載(u/Thhaki、2026-09-30)、GameFromScratch の報道(2026-09-30)は、工学的主張を率直に書いている。振る舞いドメインは Lisp 風 DSL で書かれ、**Domain source → AST → IR → generated C** を経る。生成後の実行経路はインタプリタから独立し、バージョン付き C ABI が生成ドメインをホストランタイムへ接続し、任意で C++ 統合層を使える。

リポジトリ README は同じパイプラインを検証可能な段に分解する。字句とソース範囲 → コンパイラ所有の AST → 検証とリンク(宣言、include、override、参照)→ IR → `HTNCCodeGenerator` が C ソースと静的メタデータを出す → クライアントがその C をゲームまたはドメインモジュールへ組み込む。AST と IR はビルド時表現であり、生成後のランタイム実行はそれらを**保持も依存もしない**。これはスローガンの「AOT」ではなく、`HTNTranslator --check` とコード生成コマンドで歩き切れる流水線である。

ドメインはどんな顔か。S 式風の宣言的 DSL であり、汎用 Lisp ではない。衛兵 NPC の最小メソッドはこう書ける——`guard_on_duty` が成立するとき、`!move_to` と `!scan_area` のような**原始タスク**を計画へ並べる。エンジンがそれらの意味を与え、開始・完了・失敗のタイミングを決める。メソッド分岐はソース順に試され、条件体は `and` / `or` / `alt` / `not` で事実照会と公理を組み合わせ、`!` は直ちに計画へ入る原始、通常の複合タスクは直ちに分解、`&` は**遅延分解**を出す——先の動作を実行し、ワールドステートが更新されたあとに、後続メソッドを展開する。

遅延分解は、この主張のなかで最も鋭く、最も制作向きの一刀だ。完全な計画は t0 で未来の世界について嘘をつく必要がない、と認める。先に `!move_to` し、`&after_arrival` を到着後まで残し、「そのとき」まだ見える、あるいはすでに失われた目標に対して再分解できる。ホストがスケジューリング、キャンセル、再分解要求を所有する。`&` 自体はタイマーではなく、裏でスレッドを立てもしない。計画システムは「いま正直に約束できるもの」と「遅らせてこそ正直なもの」を分ける——`Update()` のなかで一時的な真偽を使い、全程をすでに考えたと偽るより、ずっと辛辣で、ずっときれいだ。

Guerrilla『HTN Planning in Decima』公開ページ OG:Horizon 系譜の制作文脈

三、数字と機構が修辞を押さえる:入れ子バックトラッキング、C ABI、ホットリロード、209 テストと八つの SDK 変種

機構の一覧がなければ、コンパイル物語は空虚な言葉へ滑る。公開資料が与えるのは、リポジトリと突き合わせられる釘である。

**入れ子バックトラッキング。** メソッドと公理をまたぐ階層バックトラッキングは、入れ子呼び出しと代替束縛を覆う。`alt` は代替を保持し、`or` は初回成功後に残りの経路を捨てる——文案の差ではなく、失敗時に退いて束縛し直せるかという制度の差だ。Decima 講演は Prolog 的前提バックトラッキングを強調し、htn_planner は同種の問題を生成実行経路上の明示ポリシーとして書き、翻訳オプションでバックトラッキング容量と実行時モード選択を設定できる。

**バージョン付き C ABI。** 生成ドメインは C ABI でホストへぶら下がり、動的ロードされるドメインモジュールは互換性検査を伴う。アップグレードはしばしば、ドメインの再生成とホスト/ランタイムブリッジの**同時**再ビルドを要求する——README は公開 API・ドメイン言語・生成コード ABI がなお進化中だと繰り返し警告する。面倒に聞こえるが、それは誠実さだ。プランナーが「生成コード」の車線に入った瞬間、ABI はシェーダ変種の契約であり、永遠に安定だと偽れるスクリプト文字列ではない。

**可視化デバッガ。** instrumentation 付きビルドは、計画論理を変えずに生成実行を捕捉できる——メソッド、分岐、条件、公理、タスク、結果、ソース範囲、スコープ束縛。データモデルは ImGui から独立し、エンジンは自前エディタで捕捉ノードを描ける。HTNDemo は Domain Runner、生成イベントデバッガ、小型 NPC シミュレーションの三视图を提供する——デモが読み込むのはワールドステートデータだが、ドメイン定義はすでにネイティブ生成プランナーへコンパイル済みだ。Verweij の「ゲーム内で分解をデバッグする」公開約束への、ほぼオープンソースの残響である。

**ホットリロード。** 動的ドメインモジュールの参考統合では、**ホストアプリケーション**がコンパイル・ロード・リロードの編成を制御する。ドメイン反復はシェーダのホットリロードに似た制作環になる——述語とメソッド代替を直す → 翻訳生成 → ホストがリロード → 新しい分解木をすぐ見る。Jose は自作エンジンへ SDK を統合し、そこで計画とドメインリロードを試したと明記している。

**検証の数字。** 公開リリース節点で著者が示したのは、**v2.0.2 が 209 項目のテストを通過**し、加えて八つの Windows SDK 変種での外部コンシューマ検証(生成ドメイン DLL が必要なランタイムエクスポートを解決できるかの検査を含む)である。その後もリポジトリは進む。CHANGELOG では 2.1–2.3 がドメイン言語チュートリアル、Linux x64(Ubuntu 24.04 / GCC 14 / Clang 18)、負の数値リテラルなどを順に足し、本稿執筆時のメインライン VERSION は準備中の 2.4.0 を指す。本文は「209+八変種」をその公開発表の節点に釘付けし、同じ投稿で再報されていない後続数字を新しいスローガンとして発明しない。

ライセンスは MIT。貢献者注記は明快だ。生成プランナー、コンパイルパイプライン、公開リリースは Jose Antonio Escribano が主導・維持する。コア、解析、ワールドステート、統合層に残る **2023 年の共有基盤**は Sandra Alvarez(Sandruski)との共著——後者の倉庫 `Sandruski/htn-planner` は解釈型ドメイン言語路線の関連前作であり、系譜は語ってよいが、倉庫を混同してはならない。

GitHub リポジトリのソーシャルプレビュー:urosidoki/htn_planner

四、還流:インディーが盗むべきは「Horizon の光輪」ではなく、「計画をコンパイルシステムとして扱う」こと

オープンソース物語の最も有用な結末は、また一つの AAA キーワードではなく、制作倫理の還流である。

インディーと小チームにとって htn_planner が刺さるのは、明日ビヘイビアツリーを捨てねばならない点ではない。長くスタジオ内部の講義に閉ざされていた主張を、クローン可能な工学オブジェクトへ翻訳した点だ。**ワールドステート述語とメソッド代替は一等市民**である。失敗は次フレームで上書きされる一時フラグではなく、探索可能なバックトラッキングである。遅延分解は、時間が前提を書き換えることを認めさせる。ホットリロードは、ドメイン変更をシェーダ変更と同じくらい検証可能にさせる。ABI 版検査は、「生成物」をワンショットの書き出しではなく契約として扱わせる。

この SDK を使わなくてもよい。同じ倫理から、より小さな制度を抜き出せる。「敵が見える/弾薬不足/掩体に届く」を六つのコンポーネントに散らばった真偽ではなく、明示的な述語表として書く。「接近/求救/撤退」を動かせない巨木ではなく、置換可能なメソッド分岐として書く。「到着してから決める」を、計画がまだ在ると偽るスリープコルーチンではなく、明示的な第二段計画として作る。計画をコンパイルシステムとして扱うとは、各社が IR を自作せよという要求ではなく、`Update()` の雰囲気で監査可能な決定構造を代替するのをやめよ、という要求である。

収束:独立と AI は、「生成可能なバックトラッキング」のなかで再定義される

このオープンソースを 2026 年の制作現場へ戻すと、それが本当に叩くのはビヘイビアツリーの評判ではなく、より隠れた AI の惰性——高位意図はインタプリタとブラックボードの一時態で永遠に保てる、NPC が「なぜそう動いたか」のデバッグはログ乱打の運任せでよい、インディーと AAA のあいだには翻訳不能なブラックボックス経験がある、という思い込みだ。

Jose が示した反例は不格好で、きわめて工学的だ。Lisp 風 DSL、AST/IR、生成 C、バージョン付き ABI、入れ子バックトラッキング、遅延分解、可視化デバッグ、ホスト制御のホットリロード、公開リリース節点でのテストと SDK コンシューマ行列——そして繰り返される宣言、Guerrilla 経験に着想を得たが Guerrilla ソースではない、と。不格好なのは、振る舞いを翻訳可能なドメインとして書かせるからだ。高価なのは、もう一フレームの if ではなく、本当のシステム設計を消費するからだ。

こうして「独立」と「ゲーム AI」はここで再定義できる。独立は、永遠に手書きビヘイビアツリーであることと等しくない。資源がより狭いときでも、「どの決定が雰囲気だけで維持された瞬間に、ゲーム内の他者が死ぬか」を問い続けることと等しくなりうる。ゲーム AI も、機能ノードの積み上げと等しくない。その最小決定集合のために、コンパイルでき、デバッグでき、ホットリロードできる経路を用意する意思——たとえその経路が NPC を小さな言語に見せても——と等しくなりうる。

実行可能な提示は短いが、十分に辛辣で誠実だ。

  • まず「ワールドステート述語」の一覧を書く。どの十の事実が曖昧になった瞬間、NPC の高位意図は説明不能になるか。最適化や機能追加のとき、それらは拒否権を持つ。
  • 少なくとも一組の排他的意図を、重なり合うブラックボード真偽ではなく、メソッド代替(分岐+条件+タスク列)として書く。失敗時、「どの層へ退いたか」を言えるべきだ。
  • 「世界が変わってから決めねばならない」箇所を一つ見つけ、明示的な第二段計画(遅延分解、または同等の能動的再計画)として建てる。スリープフレームで計画を偽装することを禁ずる。
  • ドメイン/スクリプトのホットリロードを入れるなら、**ホスト**にコンパイルとロードの編成を持たせ、意図的な ABI/版不一致の演習を一度やれ——きれいに失敗できないホットリロードは、まだシステムではない。
  • Verweij『HTN Planning in Decima』と htn_planner のドメイン言語ガイドを読むとき、対照するのは「生成+デバッグ可能な分解」であり、「Horizon の美術光輪」ではない。

九月末の公開投稿と報道は、すでに監査基準を言い切っている。デモで賢そうに見えるか、ではない。高位決定がコンパイルされ、バックトラックされ、更新後の世界に対して再び展開できるか、である。そのあと制作現場に残るのは、より冷たい一文だけだ——あなたの NPC は計画しているのか、それとも次の一時フレームのために計画を演じているのか。

小光

出典と延伸読書

Jose Antonio Escribano、LinkedIn 公開リリース説明(およそ 2026-09-27):I’ve released HTN Planner…

u/Thhaki、r/gamedev 転載(2026-09-30):New Open-Source Enemy/NPC AI planner informed by… Guerrilla…

GameFromScratch(2026-09-30):htn_planner – AAA Inspired Game AI Framework

リポジトリと README:urosidoki/htn_planner

ドメイン言語ガイド(遅延分解 `&` を含む):docs/DOMAIN_LANGUAGE.md

Tim Johan Verweij、Guerrilla:HTN Planning in Decima(2024-11-25;Goldsmiths / AI and Games Conference 2024)

関連前作(解釈型路線。混同しないこと):Sandruski/htn-planner

延伸:Exploring HTN Planners through Example;The AI of Horizon Zero Dawn

ログインして読書記録を残しましょう。

いいね・保存を別の端末でも確認できます。

ログイン