【製作中】3Dダンジョンの自動生成システム
卒業作品として制作中のデジタルゲームで使用している、「Excelで描いたダンジョンの地図をテキスト形式に変換し、Unityで読み込んでマップを自動生成するシステム」の紹介です。(ゲーム本編を製作中であるため、随時更新予定です!)
<使用言語>
VBA, C#
<使用ツール>
- Visual Studio
- Excel
- Unity
<概要>
このようにExcelシートで作った小さなダンジョンの地図を4枚組み合わせて、
このような大きな3DダンジョンをUnity上で自動生成する機能です。
卒業制作作品に使用するため開発したシステムです。
具体的な処理の流れは以下のようになります。
1.Excelを使用して「壁がある場所には罫線を引く」「扉は点線で表現する」といったルールに従って地図を書く
2.地図を書いたシートに対してVBAマクロを使用し、シート内の情報をすべてテキストに変換し、csvファイルとして保存
3.csvファイルをUnity上に取り込み、指定されたフォルダに保存
4.Unity上でcsvファイルに記されたテキストを読み取り、4枚の地図データを1つに合成してダンジョンの壁・床・宝箱といったオブジェクトの位置や角度を決定して生成。
<製作の意図>
開発の効率化が最大の目的です。
このゲームでは今後、ダンジョンの構造を頻繫に変更・調整することが予想されるので、細かな修正を即座に・確実に反映するための基盤が必要だと感じました。
「世界樹の迷宮」シリーズのシステムをイメージして、Excelで描いた地図がそのままデータに変換され、Unity上で動作するような仕組みがあれば開発がグッと楽になると考え、製作しました。
<説明>
いわゆる「ダンジョンクロウル系」の3Dダンジョンを生成するシステムです。
現在制作中のゲームに求められている、以下の仕様を満たす形で実装しています。
- 生成するマップは高低差の無いマス目状であり、大きさはn×nマス(nは奇数)。
- マップ中央には3×3マスの広場があり、東西南北にそれぞれ廊下が伸びている。
- 広場と廊下を除いた((n - 1) / 2) × ((n - 1) / 2)マスの大きさのプリセット(マップパーツ)が数十種類存在し、これをランダムに4つ抽選して組み合わせることでマップを生成する。
図解すると以下のようになります。(n = 19の場合)
広場や廊下の形はあらかじめ決まっており、マップの四隅に存在する領域にセットするマップパーツA~Dの形状が4つランダムに抽選されます。
マップの生成に用いる地図の一つ一つは以下のようなものになります。
このようにあらかじめデザインされた
((n - 1) / 2) × ((n - 1) / 2)マスのマップパーツを数十種類、プランナーの方が作成しており、
それをランダムに4枚組み合わせることで大きな1枚のマップを合成する流れになります。
マップパーツは必ず左下の1マスが欠けています。これはマップ中央の広場に食い込む部分であるためです。
4つのマップパーツを合成する際には、マップパーツを抽選すると同時に、それらを適切に回転させる必要があります。
例えばマップパーツをC(右下)の領域にセットする場合、右上の1マスが広場に食い込むため、csvファイルに記述されたデータを180°回転させたものを計算した上でマップに反映しています。
回転の処理は行列の計算を参考に、メンテナンス性や拡張性を意識した手法で実装しています。
VBAマクロの一部です。各セルの値や罫線の情報をルールに従って文字列に変換します。
誰でも使えるよう、エラーハンドリングも丁寧に行っています。
Unity側でダンジョンの「1マス」を表現するためのクラスです。現在の仕様では1マスの情報をすべて表すには7つの変数が必要であり、これに合わせてExcel側のVBAマクロを組んでいます。
<現在取り組んでいること>
・装飾品の生成
現在は壁・床・宝箱といった必要最低限のオブジェクトしか生成していませんが、
照明や柱といった装飾用のオブジェクトも、自動的に美しく配置できるようアルゴリズムを改良中です。
・ダンジョン生成のアルゴリズム調整
このゲームはまだ試作段階であり、ゲームのルールが定まりきっていません。そのため、今後変更される可能性のある仕様を想定して柔軟に設計しています。
テストプレイ等を踏まえて仕様が変更された場合、それを素早くアルゴリズムに反映しています。