概要
本記事では、SideFXが公開している GAME JAM STARTER KIT から WFC LEVEL(WaveFunctionCollapse レベル)を Unreal Engine を使って解説します。
GAME JAM STARTER KIT のダウンロードはこちらから:
https://www.sidefx.com/ja/tutorials/game-jam-starter-kit/
このツールは WaveFunctionCollapse アルゴリズムを使用して、外部画像をドライバとして使用し、ゲームレベルを生成します。 ゲームエディタでシェイプを使用して結果に影響を与えたり、ツールによって生成されたスペース全体に要素を自動的に散布したりすることもできます。
以下のリンクから、WaveFunctionCollapse アルゴリズム(波動関数の崩壊)によるダンジョン生成のチュートリアルを確認できます:
https://www.sidefx.com/ja/tutorials/wfc-dungeon-generator/
ツールの使い方
最初にツールをロードすると、シーンに何も表示されない可能性がありますが、問題はありません。
デフォルトのパラメータが展開されているのが確認できます。
Overall Scale の値はデフォルトで 1.0 に設定されています。
値を上げてスケールさせると、レベルマップ全体のサイズを変えることができます。
パラメータの最後にある矢印のマークをクリックすると、デフォルトの値に戻すこともできます。
このツールは四つのタブを持ちます。
Input では、立方体などから自分でエリアを作り、レベルマップを構築することができます。
WFC で PNG ファイルなどの画像を読み込み、それをベースにレベルを構築することもできます。
Scatter から、マップに散乱するオブジェクトの制御をします。
Instance Models を使って、自分で用意したモデルを使ってマップを構成できます。
WFC
Enable WFC のチェックを外し、何も表示させないようにできます。
Input タブなどで別のマップを制作する際はシーンを初期化できます。
WFCを機能させるには、ベースとなる入力画像が必要です。
基本的には低解像度で、その画像から特定のパターンを複製し、レベルマップを構成します。
例として上を入力画像とします。解像度が低くなっているのが確認できます。
1K のテクスチャを用意するのではなく、あくまで 30x30 のような低解像度で、最低限レベルの基本となるテクスチャを用意します。
Texture Pattern(img)にファイルへのパスを入力し、Enable WFC にチェックが入っていることを確認します。
レベルマップが構築されたのが確認できるはずです。
Row and Columns でマップのサイズを調整します。
Overall Scale はマップをそのまま拡大するのに対して、ここではマップの規模を調整します。
値を 100 にすれば巨大なレベルマップを制作することもできます。
どこまで拡大しても、ルートや空間のベースになっているのは入力画像です。
Seed WFC でマップの構造に乱数を加えます。
他にもいくつか便利なオプションがあり、マップを調整する機能を持ちます。
Input
デフォルトではシーンに何も表示されていません。
もし WFC タブなどで既にマップを作っていた場合、あらかじめ Enable WFC のチェックを外してシーンをリセットしておきます。
シーンに Cube をドラッグして、レベルを作っていきます。
マップを作り終えたら、土台(灰色の部分)を選択した状態でパラメータの Custom area から World Outliner Input を選択します。
Start Selection をクリックし、
作ったマップをすべて選択し、
Use Current Selection をクリックします。
シーンを確認すると、Cube を配置した部分にレベルが構築されたのが確認できます。
Cube がマップを制御しているため、Cube を移動させるとマップも更新されます。
Input では手作業で立方体を配置してレベルを制作し、WFC では入力画像からランダム性を持った大規模なレベルを用意できます。
また、この二つのレベルを同時に出力することもできます。
Input タブでレベルを作った状態で WFC タブの Enable WFC をチェックすると、
二つのマップを重ねて一つとして出力されたのが確認できます。
Input から Cube を引き継いでいるため、Cube を移動させるとマップを変化します。
マップに最低限必要な部屋や通路を立方体で用意し、それ以外を WFC でランダムに表現するなど、ゲームレベルを作成するうえで非常に柔軟かつ便利な手法です。
Scatter
Scatter タブのパラメータを操作して、マップ内の空間に散乱するオブジェクトを制御することができます。
Method について、Random だとオブジェクトがランダムに配置されます。
Grid に変更すると、整列させることができます。
Seed の調整で、オブジェクトの配置に乱数を加えます。
オブジェクト量やランダム具合は変えずに配置を変えたいときなどに使えます。
Density random を変更すると、オブジェクト間の密度を調整できます。
他にも、回転や最小値と最大値の指定などのオプションが用意されています。
Instance Models
タブを選択すると、Game engine が None になっているのみで他のパラメータは表示されません。
ここを unreal に変更(Unity での開発であれば Unity に)すると、
その下に「Piece NR 1」「Piece NR 5」... とパラメータが展開されたのが確認できます。
本ツールの Instance ではタイルセットでマップを構築していきます。
Unreal のタイルセットの解説はこちら:
https://docs.unrealengine.com/ja/Engine/Paper2D/TileMaps/index.html
そのため、空欄になった各ピースに、Unreal で用意したモデルを適用させる必要があります。
ダウンロードしたプロジェクトファイルの中には複数のモデルが用意されています。
これらを、それぞれ数字が対応するパラメータに当てはめていきます。
もしモデルの大きさがマップに合わないなど、モデルのサイズを変更する必要が出た場合には、
Scale instance を変更して調整します。
今回はパッケージに用意されたモデルを使いましたが、Blender, Maya, 3dsMax などで独自で作ったモデルを利用して、ダンジョンだけでなく、洞窟や建物などを作ることができます。
また、隣接するモデル同士の接続などの問題は Houdini が自動的に解決してくれます。
マップを構成するモデルを任意で設定できるなら、当然散乱するオブジェクトにも任意のモデルを指定できます。