フィールドの自動生成(1)

プロシージャル…
ステキな響き…、憧れるわぁー、特にプロってところがプロっぽい。

※プロシージャル:日本語では「手続き型」「手続き的」などと訳され、数式や処理を組み合わせ、何らかの操作を行うこと。

ゲームにおけるプロシージャルは何なのか、定義が難しいとのことですが、ある数値なり条件なりを与えて何かを自動生成させること、と考えて良いんですよね?

で、あこがれのプロシージャルですが、RPGで自動生成と聞くとあんまり印象よくないですよね…
自動生成ダンジョンて、延々と似たような構造が続く退屈なダンジョン。
やっぱRPGって長過ぎるから自動生成でも飽きちゃうんですかね。

ただ、実際に1人でRPGの決め打ちフィールドを作ってみると1人で作ったもんだから全部構造がわかっちゃってて全然面白くないし、そのフィールドがプレイヤーにとって面白いかどうかもわかんないんですよね…

というわけで禁断の自動生成ダンジョンに手を出しました。
ただ自動生成ダンジョンの印象が良く無いので、自動生成フィールドと呼ぶことに。
このゲームにダンジョンは出てきません。攻略する地面は全てフィールドですw

【ブロックの作成】
フィールドは12個のパターンのブロックとT字路のブロックを基本にしました。
ただ、I字とL字とT字しかないのでI字とL字に道幅を広くしたバリエーションも追加してみました。
1つのブロックの大きさは可変とさせたいので、まずは(0,0)を始点に1マスずつのブロックを仮想で自動生成させて、それを実際のブロック(とりあえずデフォのブロックは1辺30mの正方形)を生成する際に30mを掛けてWorldLocationに指定してブロックをスポーンさせる、という形を取りました。
12個のブロックパターン
(y方向が±逆の設定になってしまいましたが)

こんな感じで、12個の基本ブロックパターンは自分の座標が(0,0)の時、来た方向の座標と向かう方向の座標を仕込んでおきます。

例:タイプ0のI字のブロックは、(0,0)の時、来た方向の座標は(0,-1)、向かう方向の座標は(0,1)とこんな具合にPre座標、Post座標をブロックタイプ12個分配列変数に設定しておきます。(y方向はプラスマイナス逆になってしまっていますが…)

生成の工程は

始点の(0,0)にランダムでブロックを生成

生成したブロックのPost座標に新たにランダムでブロックを生成
(ただしそのブロックのPre座標は前のブロックの座標と一致しなければならない)

これを条件として与えたフィールドの長さ分だけループさせます。

これが基本的な考え方ですが、これをやるとクネクネと曲がって作られたフィールドは場合によっては既に存在するブロックに突き刺さる可能性もあるんですよね。
なので、新たにブロックを生成する時にはその先に既にブロックが無いか調べてから生成する、と。
ただこれだけでは回避できないこともあって、そうした場合には諦める…、ではなくエレベータを作って上に逃がす!
ブロックの概念を2次元にしといてよかったw
20ブロック分の長めのフィールド
上図のフィールドを横から見ると上下の空間はエレベータでつながっている

ただ、このままではまるで迷うことの無い一本道フィールドになってしまうのでブロックを生成する段階でT字ブロックをある程度の確率で出現させることにします。
T字ブロックを出現させたらどちらかを正解ルートとして、その後のルートは同様にランダムで生成しておきます。
T字出現率条件によっては1個のフィールドに複数個T字路が出てきますが、それぞれ出てきた度にどちらかを正解ルートとして終点まで同様にランダムでルートを作っていきます。
終点までルートを作ったら、残ったT字の外れルートを作っていきます。
中央にT字ブロック
(左ルートに削除し忘れたBSPが映ってしまった…)

外れルートはあまり長いと良くないので、条件で何ブロックまで作るか決めておき、ランダム生成時に既存ブロックにぶつかった場合には生成を止め、行き止まりの所に宝箱を置いておくと、まぁ親切!
w

外れルートの行き止まりに宝箱

コメント

このブログの人気の投稿

フィールド⇔バトルについて

Level Streaming完全に理解した(わかってない)

最低限のサウンド再生について