【UnityC#講座】迷路の自動生成システムを作る


Unity2018.1.5f1
Windows10

迷路自動生成/トップ

自動生成のダンジョンに興味はおありでしょうか。
今回はそれの最もシンプルな形、迷路の自動生成システムを作ります。
迷路を自動で作るには方法がいくつかありますが今回は穴掘り法にしました。
全面が壁の空間にスタート地点の穴を作り、そこから2マス先に壁があるかどうか判定し、あればそこまでの壁を消す、なければ消さない、ということを繰り返して道を作っていきます。

迷路自動生成/例1

迷路自動生成/例2

迷路自動生成/例3

今回私は自己流でそのシステムを作ってみました。
ダンジョン作りの参考にしてもらえたら嬉しいです。

■オブジェクトを用意する

オブジェクトとスクリプトを出す

まずは空のオブジェクトを2つ出しましょう。
名前は「MazeGnerator」と「Miner」です。

Hierarchy > Create > Create Empty

次にとりあえずC#スクリプトを作ります。
名前はオブジェクトと同じ「MazeGnerator」と「Miner」にしてください。

Project > Create > C# Script

そして同じ名前のオブジェクトにアタッチしてください。

もうひとつオブジェクトを出しますが、それは壁になるCubeです。

Hierarchy > Create > 3D Object > Cube

Prefabにする

次はMinerとCubeをPrefabにします。
その2つのオブジェクトをHierarchyからProjectにドラッグ&ドロップしてください。
そしてHierarchyに残っているそれらのオブジェクトを右クリック→Deleteで消しましょう。

Prefabにするとスクリプトで生成できるようになります。
今回の迷路の自動生成システムはMazeGneratorがCubeを大量に並べ、Minerで通路を掘っていきます。
MinerはMazeGneratorからひとつ出された後は自身で判定して次々にMinerを出し役目を終えたら消えていき最後はすべて消えるという仕組みです。

■スクリプトを書く

さあ次は2つのスクリプトを書きましょう。

MazeGneratorスクリプト

スポンサーリンク

Minerスクリプト

Inspectorの設定をする

次はそれぞれのInspectorの設定をします。

MazeGneratorにはCubeとMinerのPrefabを。

迷路自動生成/MazeGenerator/Inspector

MinerのPrefabには同じMinerのPrefabをセットしてください。

迷路自動生成/Miner/Inspector

あと最後にCameraの位置をセットします。
15×15ならこの位置で良いでしょう。

迷路自動生成/Camera/Inspector

さて無事に動いたでしょうか?

迷路自動生成/完成

■作成中に困ったこと

Unityがストップした

これはなぜコルーチンにしたかの理由なのですが、最初全方向の判定とオブジェクトの消去、Minerの生成を一度にするようスクリプトを書きました。
そしたらUnityはストップしうんともすんとも言わなくなります。
処理が重すぎたのか、それとも一度に判定すると矛盾が出るためどうにもできなくなったのかは分かりませんが、コルーチンで時間差をつけることで解決しました。

迷路生成が途中で止まった

今回、MazeGneratorスクリプトから引数をMinerスクリプトのDoMining関数で受け取り、それからMiningコルーチンに引数を送っています。
しかし、MazeGneratorスクリプトから直接コルーチンに引数を送ることもでき、そうした方がコードの短縮になるとやってみた結果迷路の生成が途中で止まるようになりました。
どうもコルーチンの処理は重いようで別クラスから何度も起動させることに無理があったようです。

今回の迷路の自動生成システムですが、最初は必ずZ軸のプラスの方向から判定するという欠点があります。
他の方のやり方を見たらひとつのスクリプトで完結させていました。
コードを見ても理解できなかったのですが、自分なりのやり方で改善してみたいです。

それでは今回はこれで。
お疲れさまでした。

続きです。
【UnityC#講座】迷路の自動生成システムを改善した【配列、Switch文、List】

■関連記事

【UnityC#講座】オブジェクトを縦横規則正しく並べて生成、色を変える、子オブジェクトにして検索する

フリーゲーム「一人称で生成迷路脱出」を公開しました

スポンサーリンク

目次に戻る


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください