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

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

Unityスキルアップ、
始めるなら今

パズル、脱出、RPG...目標のゲームを完成させよう!

人気のUnity講座はこちら

Udemy講座

穴掘り法

穴掘り法とは

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

  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の座標にプレイヤーが表示され、迷路内を移動させることができました。

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

おすすめUnityオンライン学習

一人でゲーム開発が不安な方はオンラインスクールで学習すると効率が良いと思います。
以下に当てはまる人は検討してみると良いかもしれません。

「ゲーム作りけど何から初めればいい?」
「入門書をの次に何をしたらいいの?」
「疑問や問題を一人で解決出来ない。。」
「ゲームを完成させる自信がない。。」
「気軽に質問できる環境が欲しい。。」

自分で学習することに限界を感じたら
オンライン学習しましょう!

Udemy

Udemy
特徴:教材動画買い切り型
レッスン方法:動画教材/Q&Aで質問
習得スキル:教材動画によって異なる
コース概要: ピンポイントで作りたいゲームジャンルの動画を見つけることができるかもしれません。 また頻繁にセールを開催していますのでゲーム開発講座が1500円~で購入することも可能です。
ゲームジャンル別おすすめ講座はこちら Udemy 詳細

テックアカデミー

テックアカデミー
特徴:現役エンジニア伴走型レッスン
レッスン方法:チャット(週2回)/テキストチャット/課題レビュー
習得スキル:オリジナルゲームアプリの作成
コース概要: 途中で挫折しないためにメンター(相談者)が週2回、マンツーマンであなたの質問・相談に答えてくれるので、ゲーム開発・プログラミング未経験の人でも安心してゲーム開発に取り組めます。転職したい人向けのサポートもあります。無料体験もあります。
テックアカデミー 詳細

テックスタジアム

テックスタジアム
特徴:ゲーム開発の為のオンラインスクール
レッスン方法:動画教材,Slackでの質問(24時間)
習得スキル: Unity,UnrealEngine、CG、企画、サーバー、AI、XR等
コース概要: ゲーム業界で必須な技術の習得が可能です。Slack上で待機している先生への24時間、何度でも質問できます。またIT・ゲーム業界への就職サポートが無料で受けられます。
ゲーム開発に特化したオンラインスクールですので、Unityはもとより、他のゲームエンジンやゲーム業界に興味がある方にはオススメです。
テックスタジアム 詳細

デジハリONLINE

デジハリONLINE
特徴:動画カリキュラム型レッスン
レッスン方法:動画講座/Slack/予約制Zoom相談
習得スキル:Unity基礎,実践/ハイクオリティ3Dゲーム
コース概要: デジタルハリウッド大学・大学院などを通じたデジタルコンテンツ業界とのつながりを活かし、最新かつ実践的なカリキュラムを提供しています。【基礎編】【実践編】とカリキュラムが分かれていて、それぞれに課題があり、ご自身の理解度を把握できます。最終的にはハイクオリティの3Dゲームが作れるようになります。
デジハリONLINE 詳細

関連記事

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

2Dローグライトゲーム

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

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