穴掘り法で2D迷路を作る

前回、前々回と見下ろし2Dマップ上でプレイヤーを動かすことが出来ました。
今まではマップデータを自分で作ってマップを作成していましたが、今回は穴掘り法と呼ばれる方法を使って自動でマップを作ってみたいと思います。
この記事はシリーズものとなっています。

穴掘り法

穴掘り法とは

迷路を生成するアルゴリズムは棒倒し法、棒伸ばし法など複数ありますが、穴掘り法はその名の通り、穴を掘って迷路を作っていくという方法です。
まず外側の外周を通路にして、それ以外を壁で埋め尽くします。
次にランダムでスタート地点を選び、そこから伸ばせる限り穴を掘って道を伸ばしていく感じです。
具体的には上下左右の二マス先を調べ、道がなければ掘ると言った感じです。
道が伸ばせなくなったらすでに掘った道のいずれかを起点にして同じ手法で穴を掘って道を伸ばしていきます。
これを繰り返し、全ての道が掘れなくなった時点で外周を壁で埋め、迷路は完成します。
箇条書きにするとこんな感じでしょうか。

  1. 外周以外を壁で埋め尽くす
  2. スタート地点から伸ばせる限り道を伸ばす
  3. 上下左右2マス先が全て道になれば別の起点から掘る
  4. 全ての道が掘れなくなった時点で外周を壁で埋める

穴掘り法プログラミング

それでは実際にプログラミングしてみましょう。
今回はこちらの記事を参考に作ってみたいと思います。
それではUnityのAssetsフォルダにMazeCreatorというC#スクリプトを作成します。

変数や定数の定義

必要な変数や定数などを定義しましょう。

内容に関してはコメントの通りです。
Cellクラスは後々起点を保持しておくために使います。
一点注意ですが、迷路生成に関してはUnityEngineを使いませんので、MonoBehaviourは継承していません。
このMazeCreatorクラスはゲーム開始時に別のクラスから呼ばれ生成されます。

コンストラクタ作成

ではMazeCreatorのコンストラクタを作成していきます。

このような感じです。
今回の迷路では幅が5以上、そして縦も横も奇数のマス目にします。
どこの通路にもつながらない閉じた領域が出来るのを防ぎ、ぐるぐるループする迷路が出来ることを防ぐためです。

迷路作成関数

次に迷路を作成するために必要な関数を定義します。
必要な関数は4つです。

  1. 迷路データを作成する関数
  2. 掘る道を決める関数
  3. 道を彫り次の起点候補を決める関数
  4. 起点位置をランダムで選択する関数

このように関数を定義します。

ではCreateMazeを作っていきます。

続いて穴を掘っていきましょう。
Dig関数はこのようになります。

少し長いですが処理の流れはコメントの通りです。箇条書きにすると、

  1. 乱数生成用の変数を作成
  2. ループ突入
  3. 方角保持用リスト作成
  4. 上下左右2マス先までが壁かどうか判別
  5. 壁ならば方角保持用リストに方角追加
  6. 方角が0ならループ終わり
  7. 終わらないなら_x座標、_y座標に道と起点をセット
  8. 掘る方角をランダムで取得
  9. 取得した方角に掘り進める
  10. 次の起点を取得
  11. 起点が有るなら新たな起点から掘る

でしょうか。
全体が完成したら理解出来るかと思いますので、後で見返してください。

続いて道をセットし次の起点候補を保持する処理、SetPathを作ります。

こちらは至ってシンプルです。
起点となる座標は奇数にしておかないときれいな迷路にはなりませんのでご注意ください。

最後に新たな起点を選ぶ関数を作成します。

これで穴掘り法で迷路を作成するプログラムが出来上がりました。
全体も載せておきます。

生成したマップをゲームで表示する

これで2Dマップをランダムで作る準備が出来ました。
いよいよゲーム画面に迷路を表示させてみます。

マップデータを表示

前回作ったMapGeneratorの_loadMapData関数に処理をくわえていきます。
このような感じになります。

実際に起動してみるとこのように迷路がランダムで生成されています。

プレイヤーを表示させる

この状態ですとMAP_TYPEのPlayerが登場しませんので、1,1の座標にプレイヤーを表示させてみましょう。
修正箇所はMapGeneratorの_createMap関数内、マップタイルをループで生成していく箇所です。

このようになります。
実行してみるとちゃんと1,1の座標にプレイヤーが表示され、迷路内を移動させることができました。

コードが長く、難しいところも有るかと思いますが、流れを確認して読んでみるとご理解頂けるかと思います。
また今回の記事は以前の記事の続きとなっています。
前回、前々回の記事を読まれていない方は是非、読んでみてください。

この記事への感想・コメントをどうぞ

購読
通知する
guest
0 コメント
Inline Feedbacks
View all comments

Unityの学習方法

Udemy

Udemyの動画講座にもUnity関連のオススメの動画がたくさんあります。

その中でも私が特に気に入っている動画を紹介します。

テックアカデミー

途中で挫折しないためにメンター(相談者)が週2回、マンツーマンであなたの質問・相談に答えてくれます。 ゲーム開発・プログラミング未経験の人でも安心してゲーム開発に取り組めます。 受講終了後、自分のオリジナルゲームでコンテストに応募することができます。

デジハリONLINE

【基礎編】【実践編】とカリキュラムが分かれていて、それぞれに課題があり、ご自身の理解度を把握できます。 内容も充実していて最終的にはハイクオリティの3Dゲームが作れるようになります。 サイト内にカリキュラム詳細のPDFが公開されていますので、一度見てみるのも良いでしょう。 サポート体制は、回数無制限のSlackによるテキスト質問予約制のZoomによる個別質問があります。

Unity本【kindle unlimited】

私も利用しているAmazonが提供する電子書籍読み放題のサービスです。

月額980円で約200万冊以上が読み放題でとてもお得です。

また30日無料体験もできるのが魅力です。当然Unityに関する書籍もたくさん揃っています。

またC#関連の書籍や、プログラミングのものも多数あります。

プログラミング関連の書籍は値段が結構しますので、それらが無料で読めるのはかなりお得なサービスです。

30日無料体験もありますので気に入らなければその期間に解約すれば料金は発生しません

通常のUnity本

kindle unlimitedは全部のUnity関連書籍が読めるわけではありません。

通常に購入しなければ読めない本もありますので、その中から私が参考になった書籍を紹介します。

関連記事

最後までご覧頂いてありがとうございました。

Unityゲーム制作講座 多数公開

作りたかったジャンルの講座でスキルUP♪

もっと早く教えてほしかった!

Unity C#プログラミング入門

2Dローグライトゲーム開発

Unity ヴァンパイアサバイバーズ風 講座

目指せ 脱初心者!

ワンランク上の実践向けシューティング講座

プログラミング未経験でもOK

初学者向け ブロック崩しで学ぶUnityゲーム開発

作って覚える 7つの2Dパズル

段階的にUnityゲーム開発をレベルアップ