手続き型生成とノイズ
広大なマップやダンジョンを手作業なしで無限に作りたい人へ。シードで再現できるノイズと制約解決(WFC)の原理を押さえれば、破綻せず遊べる世界を自動生成できます。
- 手続き型生成はシード付き擬似乱数を関数化し、同じシードから常に同じ世界を再現する。ノイズ(Perlin/simplex)は座標から滑らかで連続な値を返すため地形の高さやバイオーム分布に、格子ベースのダンジョン生成はグラフ的な部屋接続に向く。
- 波動関数崩壊(WFC)はタイルの隣接制約から矛盾なく全体を埋める制約充足問題で、最小エントロピーのセルを観測し伝播(AC-3的な制約伝播)で候補を絞る。ローカルな見た目の一貫性は保証するが、大域的な到達可能性は保証しない。
- 生成は無制約だと遊べない。到達性・難易度・面白さは事後検証や制約の後付けで担保し、失敗時はリトライか制約付き再生成に頼る。再現性はデバッグとマルチプレイの同期に不可欠。
手続き型生成が「作るのではなく生やす」理由
広大なオープンワールド、無限に潜れるダンジョン、二度と同じにならないマップ——これらを人手で1つずつ配置するのは非現実的です。手続き型生成(procedural content generation, PCG) は、コンテンツそのものではなくそれを生み出す関数をコードとして持ち、実行時(あるいはビルド時)に地形・アイテム配置・レベル構造を計算で作ります。データを持たずに済むためストレージを節約でき、パラメータを変えれば無限のバリエーションが得られます。
PCGの土台にあるのは「乱数だが再現可能」という一見矛盾した性質です。ゲーム内の乱数はほぼ例外なく擬似乱数生成器(PRNG)で作られ、シード(初期状態)が同じなら生成される系列は完全に一致します。この決定性こそがPCGの中核で、「同じシードを渡せば誰の環境でも同じ世界が立ち上がる」ことを可能にします。
PCGは (1) 決定性を与えるシードとPRNG(同じ入力から同じ出力を保証する状態機械)、(2) 座標や位置から連続的な特徴量を返すノイズ関数(地形・分布のベース)、(3) 「この隣にはこれが来てよい/来てはならない」を規定する制約(部屋の接続、タイルの隣接規則、到達可能性)の3つで構成されます。ノイズが「自然なゆらぎ」を、制約が「遊べる構造」を担い、シードが「再現性」を貫きます。どれか1つでも欠けると、単調・破綻・非再現のいずれかに陥ります。
シードと再現性:なぜ決定性が生命線なのか
PRNGは秘密でない初期状態から漸化式で数列を生む有限状態機械であり、シードを固定すれば出力列は一意に定まります。PCGではこれを積極的に利用します。ワールドシードから各領域のシードを階層的に導出し、「チャンク座標をハッシュしてそのチャンク専用のPRNGを初期化する」設計にすると、プレイヤーがどの順序で世界を訪れても各チャンクは常に同じ内容になります。
チャンク単位の決定的生成(座標ハッシュ方式):
world_seed = 0xC0FFEE // ワールド全体の種
fn chunk_rng(cx, cz):
// チャンク座標とワールドシードを混合してローカルな種を作る
local = hash(world_seed, cx, cz) // 例: splitmix / FNV など
return PRNG(seed = local) // このチャンク専用の乱数源
// 生成順に依存しない: (cx,cz) が同じなら常に同じ rng が得られる
rng = chunk_rng(12, -7)
height_variation = rng.next_float()
再現性が効くのは見た目の一貫性だけではありません。第一にデバッグ——バグ報告に添えられたシードを入力すれば、同じ地形・同じ敵配置を手元で完全再現でき、乱数由来の不具合を確実に追えます。第二にマルチプレイの同期——全クライアントが同じシードとアルゴリズムで生成すれば、巨大なマップデータを送らずにシード値だけ配ればよく、ネットワーク帯域を劇的に節約できます。ただしこれは全プラットフォームで浮動小数点や生成順が完全に一致することが前提で、少しでもずれると世界が食い違います。
再現性は「シードを固定した」だけでは保証されません。(1) 並列生成で消費順が変わるとマルチスレッド環境で結果がぶれるため、チャンクごとに独立したPRNGを持たせて順序依存を断つ。(2) 浮動小数点の非決定性——fmaの有無やコンパイラの最適化、CPUによって最下位ビットが変わり得るため、クロスプラットフォームで一致させたいなら固定小数点や厳密なIEEE754順序に固定する。(3) グローバルな共有乱数源を複数システムが奪い合うと、UIやエフェクトが1回rngを回しただけで以降の生成が全滅する。生成用の乱数は演出用と必ず分離します。
ノイズ:地形とバイオームの連続的なベース
ダイスを振るような独立乱数は「隣同士が無関係」なので、そのまま高さに使うと砂嵐のようなギザギザにしかなりません。地形が欲しいのは空間的な相関——近い場所は似た高さ、遠い場所は異なる高さ——であり、これを与えるのがノイズ関数です。座標を入力すると滑らかで連続、かつ決定的な擬似乱数値を返します。ゲームで多用されるPerlinノイズやsimplexノイズは勾配ノイズの一種で、格子点に勾配ベクトルを置き距離ベクトルとの内積を補間することで、格子点で0を通る自然な起伏を作ります(ノイズ関数そのものの数理はグラフィックス側で詳説)。
PCGでのノイズ活用の要点は周波数と合成です。単一周波数のノイズはのっぺりするため、周波数を倍・振幅を半分にしたノイズを数オクターブ重ねるフラクタルブラウン運動(fBm)で「大きなうねり+中くらいの丘+細かい凹凸」という多重スケールの地形を作ります。さらに複数のノイズを役割分担させるのが実務の定石です。
高さ場とバイオームを別ノイズで決める例:
// 標高: fBm で多重スケールの起伏
elevation = fbm(x, z, octaves=6, lacunarity=2.0, gain=0.5)
// 気候: 標高とは独立した低周波ノイズ2枚
temperature = noise(x*0.001, z*0.001) // 大陸規模でゆっくり変化
moisture = noise(x*0.001 + 1000, z*0.001)
// 標高×気温×湿度 の3軸でバイオームを表引き
biome = biome_table(elevation, temperature, moisture)
温度・湿度を標高と無相関な別シード・低周波のノイズにすることで、山の中に砂漠と雪原が混在するといった破綻を避け、「暖かく湿った低地は熱帯雨林、寒く乾いた高地はツンドラ」のような自然な分布が生まれます。ノイズは地形以外にも、鉱脈の密度、洞窟の空洞判定(3次元ノイズがある閾値を超えた場所を空洞にする)、植生のばらつきなど、あらゆる「連続的なゆらぎ」の源になります。
ダンジョン生成:離散的で「グラフ的」な構造
横にスクロール
地形が連続量なのに対し、ダンジョンは離散的で構造的です。部屋と通路という単位があり、「入口から出口へ到達できる」「鍵は錠より前にある」といった論理的な制約を満たす必要があります。ここではノイズより、グリッドやグラフを直接操作するアルゴリズムが主役になります。
代表的な手法は目的で選び分けます。BSP(二分空間分割)は矩形領域を再帰的に区切って各区画に部屋を置き、分割木の兄弟同士を通路でつなぐため、部屋が重ならず整然としたダンジョンになります。セルオートマトンは各セルを「周囲の壁の数」で反復更新し、有機的な洞窟状の空間を生みます。ランダムウォーク(ドランカーズウォーク)は掘削点をランダムに動かして通路を穿ち、曲がりくねった自然な坑道を作ります。回廊優先+部屋配置を組み合わせる古典的ローグライク方式もあります。
| 手法 | 生成される形 | 接続性の担保 | 向く用途 |
|---|---|---|---|
| BSP分割 | 整然とした矩形部屋群 | 分割木をたどり必ず連結 | 地下要塞・人工建造物 |
| セルオートマトン | 有機的な洞窟・空洞 | 別途フラッドフィルで検査 | 自然洞窟・鉱山 |
| ランダムウォーク | 曲がりくねった通路 | 掘った跡が連続し連結 | 坑道・迷路的な道 |
| グラフ文法 | 意味を持つ部屋の連鎖 | 設計上の順序を明示制御 | 鍵と扉・ボス前構造 |
構造的なダンジョンで決定的に重要なのは接続性の保証です。BSPやランダムウォークは掘った跡が連続するため連結が自然に保たれますが、セルオートマトンは孤立した空洞を生みやすい。そこで生成後にフラッドフィル(連結成分の探索)をかけ、入口から到達できない領域を検出して、埋めるか通路でつなぐ後処理を入れます。「鍵→錠→ボス」のような順序制約は、部屋を並べてから配置すると破綻しやすいため、グラフ文法(抽象的な部屋グラフを先に組み、後から幾何形状へ具体化する)で論理構造を先に確定させるのが堅実です。
波動関数崩壊(WFC):隣接制約から全体を埋める
波動関数崩壊(Wave Function Collapse, WFC) は、タイルの局所的な隣接規則だけから、矛盾のない全体を敷き詰める手法です。名前は量子力学の比喩ですが、実体は制約充足問題(CSP)です。各セルは初期状態で「どのタイルにもなり得る」重ね合わせ(候補集合、例えば {草, 砂, 水})を持ち、これを1つに確定(観測)しては、隣接規則で周囲の候補を絞る(伝播)を繰り返します。
WFC のコアループ(オーバーラップ/タイル方式共通):
1. 初期化: 全セルの候補 = 全タイル集合
2. 観測: エントロピー(候補数)が最小のセルを選び、
重み付きランダムで候補を1つに確定する
3. 伝播: 確定によって隣が取れなくなった候補を除外し、
変化が起きたセルの隣へ連鎖的に波及させる(AC-3 的)
4. 2〜3を全セル確定まで繰り返す
5. 矛盾(候補が空のセル)が出たら失敗 → 巻き戻すか最初からやり直す
観測で最小エントロピーのセルを選ぶのが肝です。候補が少ない(=制約が強い)セルほど間違えると即矛盾するため、確定的な場所から埋めていくと破綻しにくい。伝播は本質的に制約伝播(AC-3)で、「あるセルの候補が減ると隣の候補も減る」を連鎖させて探索空間を刈り込みます。入力は少数の例示画像(オーバーラップモデルでは、その中に現れるNxNパターンの共起)や、タイルごとの手書き隣接表で与えられ、WFCはその局所統計を再現する大きな出力を生みます。
WFCが保証するのは局所的な見た目の一貫性——出力のどこを切り取っても入力に現れた隣接パターンだけで構成される、という性質だけです。大域的な性質は一切保証しません。「入口から出口へ道がつながっている」「重要オブジェクトが必ず1個存在する」「左右対称」といった条件はWFC単体では満たせず、しばしば矛盾(候補が空になるセル)で失敗して最初からやり直します。実務では、事前に一部セルを確定させる種まき(pre-seeding)、生成後の到達可能性チェックと不合格ならリトライ、大域制約を扱える別ソルバとの併用などで補います。制約が厳しいほど失敗率が上がり、生成時間が跳ね上がる点も設計上の注意です。
制約とプレイ体験:無制約の生成は遊べない
PCGの最大の落とし穴は「生成できること」と「遊べること」が別問題である点です。ノイズもWFCもダンジョン生成も、放っておけば到達不能な出口、即死の初期配置、難易度が破綻したマップを平気で生みます。面白さ・公平さ・クリア可能性は生成アルゴリズムからは自動的には出てこないため、明示的に制約として組み込むか、事後に検証する必要があります。
実務のアプローチは大きく2系統です。生成&検査(generate-and-test) は、まず生成し、ソルバやシミュレーションで「クリア可能か」「難易度が範囲内か」を検証し、不合格ならシードを変えて再生成します。実装が単純で強力ですが、制約が厳しいと不合格が続き生成コストが膨らみます。制約充足による生成(solver-based / constructive) は、最初から制約を満たす解しか作らない(WFCや探索的手法がこれに近い)方式で、破綻は減りますが制約の記述と求解が難しくなります。
最も踏みやすい地雷が到達可能性です。プレイヤーがスポーン地点から目的地(出口・鍵・ボス)へ物理的に行けるかは、生成器が意図しても偶然の壁配置で崩れます。定石は生成後にグラフ探索(BFS/フラッドフィル)で連結性を検算し、到達不能なら (a) 通路を1本掘って接続する、(b) そのシードを棄却して再生成する、のいずれかを機械的に適用することです。プラットフォーマーなら「ジャンプで届く高さか」まで含めた物理的到達性の判定が要ります。「生成したら必ず検算する」を規律にすると、稀な破綻シードによるクレームを根絶できます。
プレイ体験の観点では、純粋な乱数は往々にして「不公平に感じる」ことも重要です。真の一様乱数は連続した悪い目(レア泥がいつまでも出ない、同じ敵が固まる)を平然と生みます。多くの商用タイトルは擬似ランダム分布(試行ごとに確率を上げるPRD)や、めり張りを付ける重み調整、直近の履歴を見て偏りを抑える補正を入れ、「ランダムだが理不尽ではない」体験に整えます。手続き型生成は、生の乱雑さを制約とチューニングで飼いならして初めてプロダクトになります。
- シードと再現性: PCGはシード付きPRNGの決定性に依存し、同一シード+同一アルゴリズムなら全環境で同一出力。チャンク座標のハッシュから局所PRNGを導けば生成順に非依存。浮動小数点の非決定性と共有乱数源が再現性の主な破壊要因。
- ノイズの役割: Perlin/simplexは座標から連続・滑らか・決定的な値を返し、fBmで多重スケール地形を、独立した低周波ノイズでバイオーム分布を作る。連続量の生成に向く。
- ダンジョン生成: 離散・構造的でグラフ的。BSP/セルオートマトン/ランダムウォーク/グラフ文法を目的で選ぶ。接続性はフラッドフィルで検算するのが必須。
- WFC: タイルの隣接規則から矛盾なく敷き詰める制約充足問題。最小エントロピーのセルを観測し制約伝播(AC-3的)で刈る。局所一貫性は保証するが大域的な到達性・存在性は保証しない。
- 制約とプレイ体験: 生成できる≠遊べる。到達可能性・難易度・公平性は制約の組み込みか事後検証(generate-and-test)で担保。純乱数は不公平に感じるためPRD等で補正する。
まとめ
手続き型生成は、コンテンツそのものではなく生成関数を持つことで、無限のバリエーションをストレージなしに作り出す技術です。その根幹はシード付きPRNGの決定性で、同じシードから同じ世界を再現できることがデバッグとマルチプレイ同期の生命線になります。連続的な地形やバイオームはPerlin/simplexノイズとfBmで空間的相関を持たせて作り、離散的で構造的なダンジョンはBSP・セルオートマトン・ランダムウォーク・グラフ文法をグラフ的に扱って生成し、接続性はフラッドフィルで必ず検算します。波動関数崩壊は隣接制約から矛盾なく全体を埋める制約充足問題で、最小エントロピーのセルを観測し制約伝播で刈り込みますが、保証するのは局所的な一貫性だけで、到達可能性のような大域性質は別途担保しなければなりません。そして最も重要なのは、生成できることと遊べることは別物だという認識です。到達可能性・難易度・公平性は、制約として組み込むか事後に検証(generate-and-test)して初めて成立し、純粋な乱数さえプレイ体験のためには補正が要ります。ノイズが自然なゆらぎを、制約が遊べる構造を、シードが再現性を与える——この3つを噛み合わせることが、破綻せず二度と同じにならない世界を生む鍵です。
ゲーム開発の記事ガイド
手続き型生成とノイズを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
ゲーム開発
比較で見る軸
難易度: advanced / カテゴリ: ゲーム開発 / タグ数: 6
導入後に効く点
波動関数崩壊(WFC)はタイルの隣接制約から矛盾なく全体を埋める制約充足問題で、最小エントロピーのセルを観測し伝播(AC-3的な制約伝播)で候補を絞る。ローカルな見た目の一貫性は保証するが、大域的な到達可能性は保証しない。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- ゲーム開発
- タグ数
- 6
判断チェックリスト
- 自社の用途が「ゲーム開発 / 手続き型生成」に近いか確認する。
- 強みである「手続き型生成はシード付き擬似乱数を関数化し、同じシードから常に同じ世界を再現する。ノイズ(Perlin/simplex)は座標から滑らかで連続な値を返すため地形の高さやバイオーム分布に、格子ベースのダンジョン生成はグラフ的な部屋接続に向く。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。