ITエンジニアのための勉強会・イベントレポート情報メディア

Unityで作ろう!ゲームアルゴリズム(5)ゲームにおける自動生成技術(2Dダンジョン自動生成編)
skill

Unityで作ろう!ゲームアルゴリズム(5)
ゲームにおける自動生成技術(2Dダンジョン自動生成編)

2017.02.23

 
  • このエントリーをはてなブックマークに追加

最近Unityでドツボにはまり、解決に数日を費やしてしまった問題がありました。

とあるmBaaSのSDKを導入したところ、Android端末で実行したときのみエラーを吐いて止まってしまうのです。
再現率は100%。

原因は単純で、Build Settingsの「Stripping Level」の設定ミスによるものでした。
これはアプリのサイズを小さくするための設定で、Android向けの設定を最小サイズである「Use micro mscorlib」にしていた影響で、SDK内で使われていた通信処理の一部が削られてしまい、動かなくなっていました。

考えつく限り色々なことを試し、最終的には原因に辿り着きましたが、ものすごく遠回りをしてしまったわけで。
たかだかプルダウンの設定値ひとつがいかに重要なものであるか、あらためて身にしみた出来事でした。
(みなさまもお気をつけくださいませ・・・)

さてさて、余談はこのへんにして本題へ。

前回はプロシージャル技術について勉強しましたね。
今回は実際にゲームの要素をプロシージャルに生成してみます。

生成できるゲーム要素は多岐にわたりますが、今回はとっつきやすいものとしてダンジョンの自動生成に目を向けてみましょう。

賀好 昭仁

ダンジョンの自動生成の例

ダンジョンを自動生成するゲームは、古くから存在しています。
その中でも、ローグはダンジョン自動生成の元祖と言ってよいでしょう。

ローグは1980年にリリースされたPCゲームで、敵を倒したりアイテムを集めたりしながら自動生成されるダンジョンを進んでいきます。
グラフィックは全て文字(敵も通路もアイテムも半角1文字で表現されます)というチープさながらも、プレイヤーの判断力が重要になるターン制を採用。
ダンジョン自動生成も相まって、そのゲーム性の高さで人気を博しました。

現在でもこの「ローグ」に似たゲームは「ローグライクゲーム」と呼ばれ、ゲームジャンルのひとつになっています。
国内でよく知られているゲームですと、不思議のダンジョンシリーズなどがローグライクゲームにあたります。

また、みなさんが大好き(?)な「Minecraft」も、ダンジョンが自動生成されますよね。
(ダンジョンと言うよりも世界全体ですが)

ちなみに、ファミコンゲーム「ドルアーガの塔」のダンジョンも、実は自動生成らしいです。

ただし、ドルアーガの塔は毎回変わるわけではなく、同じマップを毎回生成しているとのことです。
せっかくの自動生成なのに、ちょっともったいないですね。

なぜ自動生成をするのか考えてみる

自動生成を試す前に、なぜダンジョンの自動生成をするのかを考えてみましょう。

メリットはたくさん思い浮かびます。

・内容が毎回変わることでユーザを飽きさせない
→ダンジョンのマップや敵の配置が変わるだけで、プレイ感が大幅に変わるというわけです。
・大量のコンテンツを準備する場合、開発時間が大幅に短縮できる
→例えば100種類のマップが必要だったとしても、自動生成であれば1つのロジックを書くだけで解決です。
・思いもよらなかった良コンテンツができあがる
→自動生成された要素がうまく絡み合うと、開発者も想像しなかったような良質なコンテンツができあがることがあります。
・開発者自身もプレイを楽しめる
→開発者自身も生成されるダンジョンがどんな形かわからないので、楽しんでプレイできちゃうわけです。

一方で、デメリットもたくさん。

・手作りと比べると質が落ちやすい
→たとえばマップを10個作る必要があったとして、手作りした場合と自動生成した場合を思い浮かべてみてください。
手作りの方が凝った作りになりそうですよね。
・バランスの調整が難しい
→ダンジョンのマップや敵、アイテムなど複数の要素を自動生成した場合、それぞれの兼ね合いを考えながらゲームバランスを整えるのはかなり大変です。
・デバッグも難しい
→自動生成ロジックはしばしばランダム値を元に計算を行うため、特定の値でだけ発生する不具合があったりするととっても困ります。
テストの時は何度試しても再現できなかったのに、リリース後バグってるぞと酷評されたり・・・。
・処理が複雑になる
→自動生成はたいてい計算が多く、複雑になりがちです。

思いつく範囲ですと、こんな感じでしょうか。
並べてみると一長一短ですが、ほかの方法では得難いメリットがありますね。

2Dのダンジョンの自動生成を試してみる

ざっくりと概要を把握したところで、Unityを使ってダンジョンのマップを自動生成してみましょう。

今回は
・ダンジョンを細かくエリアに分け、各エリアに部屋をひとつ作る
・部屋と部屋をつなぐ通路を作る
・すべての部屋は通路でつながっている
という条件にもとづいて自動生成を行うようにしてみました。

Unityで動くプログラムを準備しました。
プロジェクトはこちらからどうぞ。
https://github.com/akako/gamealgorithm-dungeon-generator-2d

・DungeonGenerator.cs
今回ポイントとなるのは、こちらのスクリプトのみ。
https://github.com/akako/gamealgorithm-dungeon-generator-2d/blob/master/Assets/Scripts/DungeonGenerator.cs

処理の流れは単純で、ダンジョンの部屋を作るAreaオブジェクトがどんどん分裂していくので、あとはそれぞれの部屋に通路をつないであげているだけです。

各所の処理は少々ややこしいですが、できるだけ役割ごとにオブジェクトを分けてイメージしやすいように実装してみました。

ちなみに、生成されたダンジョンのサンプルはこちら。
(実行するたびに毎回変わります)

いかがでしょう?
ダンジョンっぽいですよね?

オマケ:マンデルブロ集合で遊ぼう

ダンジョンとは関係ありませんが、前回ご紹介したフラクタルの代名詞とも言える「マンデルブロ集合」とUnityを組み合わせて遊んでみました。
Qiitaにまとめていますので、ぜひご覧ください!
http://qiita.com/Ijoru/items/976935225beff0a5540f
なお、↑の記事のサンプルプロジェクトはゲームではありませんが、地形データをプロシージャルに変化させていますので開発のヒントになるかもしれません。

まとめ

プロシージャル技術の一端として、ダンジョン自動生成にチャレンジしました。

今回のプログラムはあくまでひとつの例であり、生成のアルゴリズムのパターンは無限大(と言うよりも自由)です。
サンプルをカスタムしていただいても良いですし、まったく違ったアルゴリズムでダンジョンを生成するのも面白いと思います。

たとえば、「迷路の自動生成」で調べると、ダンジョンにも応用できそうなアルゴリズムが見つかります。
これを使ってダンジョンを自動生成できれば、まったく違った地形になるでしょう。

また、「ダンジョンの自動生成」で調べると、筆者のサンプルとは全く異なるアプローチで実装されたUnityサンプルが見つかります。
目指しているものは同じでも驚くほど実装が異なっているので、比べてみると面白いです(笑)

みなさまもぜひ色々と試してみてください!

次回予告

今回は2Dのプロシージャル技術に触れてみましたので、次回は3Dのプロシージャル技術に触れてみようと思います。

原稿: 賀好 昭仁
qnoteスマホアプリ開発チーム技術主任。PHP・Android・iOS・Unityなど複数のプラットフォームでの開発を行う。
しばしば7匹の先輩猫社員たちにイスを占領される。

Unityで作ろう!ゲームアルゴリズム(5)ゲームにおける自動生成技術(2Dダンジョン自動生成編)

この記事はどうでしたか?

おすすめの記事

キャリアを考える

BACK TO TOP ∧

FOLLOW