Unity Create a Game Series (E12. finishing the map generator)をやってみました。

引き続き、「Unity Create a Game Series」をやりマップの自動生成の作業が完了し、第7回までに作ったトップダウンシューティングゲームに組み込みました。

マップ自動生成をゲームに組み込んだところ
マップ自動生成をゲームに組み込んだところ

今回の第12回は、障害物に高低差を付け、グラデーションを付けれるようにしました。高低差はScaleで変更できるのが容易に想像できますが、Materialをプログラムから操作するのは少ないので、このチュートリアルで扱えてよかったです。また、今回は、Game.unityシーンに、MapGeneratorのオブジェクトをコピーペーストしてゲームに反映させました。MapGenerator.unityはシーンとして独立して保存しているのでいろいろ修正が可能です。

002
Unityエディターで、各マップを設定できるようにしている

MapGeneratorスクリプトには、Mapクラスを作り、その配列をUnityエディターから操作できるようにしたので、ちょっとしたマップの修正を検証するのが簡単になりました。

マップ自動生成の基礎プログラミングを手に入れた

様々なパラメータを修正できる
様々なパラメータを修正できる

今回まで一番の収穫は、プロシージャル・ジェネレーションの基礎を学習できたことです。ローグライク系ゲームのように、フロアを自動生成するような仕組みに作り替えたりはまだできませんが、それをするためのメッシュ生成や配列操作などは学べました。

このプロジェクトの配布

http://hajimete-program.com/games/Unity Create a Game Series (E12. finishing the map generator).zip

Unity Create a Game Series (E10. map connectivity)をやってみました。

Sebastian LagueさんのUnity5チュートリアル「Create a Game (Unity 5)」の
Unity Create a Game Series (E10. map connectivity)をやってみました。

このチュートリアルは、第8回になる「E08. tile map」からは今までのプロジェクトと独立していて、第8回からでもチュートリアルとして始められるようになっています。主なテーマは、マップ生成です。

Unityエディターで様々なマップを自動生成
Unityエディターで様々なマップを自動生成

E08,E09,E10と作業して、上記のような自動生成ができるようになりました。マップ生成は複雑に感じますが、実際にはライフゲーム、倉庫番、テトリスのような二次元配列を使い、隣接するXY要素の衝突判定やフラグ判定を行うときと基本的な仕組みは同じでした。またマップの場合は、道が途切れ内容にする方法が必要ですが、これは、アルゴリズムとして確立していてFlood Fillアルゴリズムを使いました。と言ってもやっているとは簡単で、中心をまず調べ、その隣接する障害物じゃないものを調べ続けるという事再帰的に繰り返していくだけです。

マップが二次元配列になっているので、以下が成り立ちます。

マップ全体の要素数 – 壁の数 = 通れるタイルの数

実際の例に置き換えると、以下のようになります。

10×10のマップ(100要素) – 10個の障害物 = 90個の通れるタイル

よって、Flood Fillアルゴリズムで、通れる道を調べたときに、90個に達しなければどこかの道が壁でおおわれていることになります。この仕組みを、壁を作るときに応用し、壁を作ってみて、その時点で、Flood Fillで道を調べふさがってしまったら、壁をいったん取り消すということを、壁の最大個数にするまで繰り返しマップを作ります。

 

このプロジェクトの配布

http://hajimete-program.com/games/Unity Create a Game Series (E10. map connectivity).zip

まとめ

マップ自動生成の基本部分はできたので、あとはUnityのNavigation対応と、壁などの装飾を残すだけです。1回の動画時間は20分以内ですが、一時停止し細かいロジックを理解するとなると1時間を超える作業になるので、思っている以上に時間がかかり大変です。

2.プロシージャルジェネレーションの動画チュートリアルをやってみます

プロシージャル洞窟生成のYoutube動画チュートリアルの二回目をやってみました。今回は、二次元配列をそのまま描画するのではなく、二次元配列から4点を取り(=コントロール・ノード)、各線の中間に点を取り(=センター・ノード)、各頂点に対して、キューブを生成するようになりました。またセンター・ノードのほうは若干小さなキューブを描画するようにしました。

ソースコード解説

このソースコードは下のメソッドから見るとよいです。

  1. 頂点であるXYZ座標を保持するNodeクラスを定義
  2. 自身のNodeと、上と右に隣接するNodeを保持するControlNodeクラスの定義
  3. 4つのControlNode(=4つの頂点座標)を四角形としてまとめるSquareクラスの定義

上記の頂点XYZはNodeクラス、隣接する頂点も管理するControlNode、それを4つに束ねたSquareクラス、このデータ構造を踏まえて、あとは入力された二次元配列が、xy座標を持つので、そこからSquareの二次元配列を作っているだけです。データ構造をしっかり頭に入れていると、SquareGridで生成している部分のコードもすんなり読めるようになります。

このプロジェクトの配布

 

http://hajimete-program.com/games/Procedural%20Cave%20Generation%20E02.zip

 

 

1.プロシージャルジェネレーションの動画チュートリアルをやってみます

Unity公式サイトにリンクが掲載されているダンジョン生成動画チュートリアルをやってみます。Unity5.3で問題なく動作しました。

やっていることはとても単純で、セル・オートマトン(Cellular Automata)と言っているのでライフゲームを作るアルゴリズムと似たようなものでした。描画にはUnityのデバッグ用のGizmoという仕組みを使いました。これはUnityのシーン上に、線やキューブなどを配置してデバッグ情報として使える機能です。

アルゴリズム概要

  1. 二次元配列を用意する
  2. 各要素にランダム生成した1または0を入れる。
  3. 二次元配列を走査し、隣接する要素を数え4以上なら空間、4以下なら壁にする。
  4. 3を複数回返してダンジョンにしていく。
  5. UnityのGizmoで、キューブを生成して描画

隣接する要素を数えるのは、ライフゲームでもテトリスでも2Dゲームではよくあることですが、それを複数回繰り返してスムーズにするという仕組みはとても興味深いものでした。

A04

このプロジェクトの配布

http://hajimete-program/games/Procedural Cave Generation E01.zip

 

Unity5の洞窟、ダンジョン生成チュートリアル動画の紹介

洞窟やダンジョンは自分で地道に作成するのもよいですが、Unityでは自動生成するアセットや作成方法のチュートリアルが豊富にあるので紹介します。

セルオートマトン(Cellular Automata)の基礎から入っていくチュートリアルです。ライフゲームを作ったことがある人はすんなり入っていくことができます。ライフゲームの仕組みを応用すると洞窟やダンジョンが作れるのがとても驚きです。最初の動画を試してみましたが、単純に生成アルゴリズムなのでUnityだけではなく別の言語やシステムでも使える技術をわかりました。様々な場面で応用できそうです。

Unity公式でも「Basic 2D Dungeon Generation」というチュートリアルがありました。こちらは1時間の動画なのでこちらのほうが学びやすそうです。この動画ではよくあるローグライク系の部屋を生成する方法が学べるようです。

POSTDの記事「手続き型のダンジョン生成アルゴリズム」もダンジョン生成の仕組みを調べるとっかかりになりそうです。