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

Unityで作ろう!ゲームアルゴリズム(6)ゲームにおける自動生成技術(3D地系自動生成編)
skill

Unityで作ろう!ゲームアルゴリズム(6)
ゲームにおける自動生成技術(3D地系自動生成編)

2017.03.09

そろそろ新しいゲームを作りたいなーと思ったりしている今日この頃。
「Nintendo Switchという魅力的なゲーム機も現れたことだし、せっかく作るのであればちょっとでもお財布の足しになればいいなー」と思って前回リリースした個人制作ゲームの収益を時給に換算してみたところ、なんと時給数円という結果に。
DL数もショボショボだったので仕方無いですが、下手に計算なんてするものじゃないですね。(笑)

ゲーム作りが好きなのであれば収益はいったん置いておいて、面白いゲームを作ることに集中した方がきっと幸せになれます!

さてさて、本題に入りましょう。

前回は2Dのダンジョンを自動生成しました。
なかなかいい感じのダンジョンができましたので、ちょっと味付けすれば色んなゲームに生かせそうでしたね。

今回は3Dでの自動生成にチャレンジしてみます。

賀好 昭仁

3Dゲームにおけるプロシージャル

3Dゲームでは立体的な表現によってゲームの臨場感・リアルさが増しますので、樹木・岩・地形などのさまざまな自然物をプロシージャルに生成できれば更に臨場感が増します。

以前軽くご説明しましたが、自然物はフラクタルな構造をしているものがたくさんあります。そのため、自然物とプロシージャル生成との相性はとても良いと言えるでしょう。

樹木や岩の生成も面白そうですが、今回は地形を自動生成してみることにします。

Unityにおける地形の表現方法

Unityは地形を表現するためのTerrainという機能を備えています。

Terrainはエディタ上から地面を上げたり下げたり、色を塗ったりすることができます。
もちろんスクリプトから制御することも可能で、地形を作るにあたってはとても強力な機能といえます。

ただ、Terrainは1枚の板に高さを付けることで地形を表現しますので、横穴を掘ることができません。
そのため、ダンジョンや浮島などを作りたい場合はTerrain以外の3Dオブジェクトを使用する必要があります。

一方MinecraftなどのゲームではTerrain的な仕組みは使用されておらず、あらゆる地形が立方体ブロックで表現されています。
Terrainと比べると見た目はチープになりますが、ブロックを置いたり消したりするだけで横穴・浮島なども自在に表現できるのが魅力です。

地形データの生成方法

では、地形データはどのように生成すれば良いのでしょうか。

前回のような2Dダンジョンですと、部屋を作って通路を繋ぐ、という直感的なイメージで進められました。
3Dダンジョンであれば座標軸を一つ追加して同じような手法が使えそうですが、ダンジョンではなく地形の生成となると、前回とは違った形のアプローチが必要になります。

方法はさまざまですが、地系生成の基礎の基礎として

  • ・中点変位法
  • ・パーリンノイズ

などの方法があります。

中点変位法とは

マップの中点を変化させることで、自然な地形を作り出す手法です。

まずは正方形マップの4隅の高さを適当に決め、「4隅の高さの平均値+ランダムな値=正方形の中心の高さ」とします。
次にこの正方形を4つに分割し、分割したそれぞれの正方形に対して同じ処理を行います。

この手順を繰り返すことにより、どんどん細かな凹凸ができて自然な地形ができあがります。

パーリンノイズとは

パーリンノイズは地形の生成のためではなく、元々はテクスチャ生成のために開発されました。
パーリンノイズを使うと色の濃淡がなめらかで自然なノイズ画像が生成できるため、煙や雲などモワモワっとした自然物のテクスチャを生成することができます。
この色の濃淡を高さとして地形に反映することで、なめらかな地形ができあがるというわけです。

そして、Unityには値を渡すだけでパーリンノイズの計算結果を返してくれる関数があります!

Mathf.PerlinNoise();

ということで、今回はより実装が簡単なパーリンノイズを使って地形の生成をしてみることにしました。

やってみた

先に書いた通りパーリンノイズはUnityに関数がありますので、スクリプトはとってもシンプルです。
https://github.com/akako/gamealgorithm-world-generator-3d/blob/master/Assets/Scripts/Main_Controller.cs

今回はTerrainを使わず、ブロックで地系を表現してみました。

また、地面ブロックを置くだけですと少し寂しいので、一定の高さ以下の部分には半透明の水ブロックを置く処理を追加してみました。

実際に動かしてみるとこんな感じです。
ブロックを大量に生成するので、動作はかなり重め。
https://youtu.be/ZfiCP2FDMsk

サンプルプロジェクトはこちらからどうぞ。
https://github.com/akako/gamealgorithm-world-generator-3d

より自然な地形に近づけるために

中間変位法やパーリンノイズには限界があります。
生成される地系は毎回違うものの、没個性的で似たり寄ったりの地系ができあがってしまうのです。

反面、現実世界の地系は多種多様でダイナミックですよね。

現実世界をヒントにした地系を作る場合はさまざまな工夫が必要です。

川を流すのであれば高いところから低いところに向けて水を流す(地面を削る)アルゴリズムを書いてみたり、険しい山脈であれば地形データを何個も掛け合わせて複雑な起伏にしてみたりと、さまざまな方法が考えられます。

微粒子が不規則に振動することをブラウン運動と呼ぶのですが、この動きの計算式をフラクタルの計算式と組み合わせることで、より複雑な地系を生成することも可能なようです。
こちらは筆者が理解しきれていませんので、詳しい説明はまたの機会に(笑)。

筆者も調べてみましたが、凝った地系を表現するための手法は人によってさまざまで、これといった正解が無いように思えました。
どうすれば現実世界に近いものを生成できるか開発者自身が想像を膨らませ、独自のアルゴリズムを組み上げていくしか無いのかもしれません。

まとめ

3D地形生成は「自然物の生成を試みる」ことだと言えます。

今回はパーリンノイズで簡易な地系生成を行いましたが、これはあくまでも基礎の基礎。
本格的な地形生成エンジンの開発に取り組もうとするならば、それだけで何年何十年と費やす価値があるでしょう。

さらにVRを組み合わせることで素晴らしい臨場感を味わうことができますので、自分好みの世界を作ってVRで旅してみるのも面白いですよ。

次回予告

しばらくプロシージャルに関するテーマが続きました。
このテーマは書くことが尽きないのですが、ちょっと深すぎるのでいったんシンプルなゲームのアルゴリズムに戻ることにします(笑)。

ということで、次回はシューティングゲームのアルゴリズムにチャレンジしてみます!

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

Unityで作ろう!ゲームアルゴリズム(6)ゲームにおける自動生成技術(3D地系自動生成編)

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

おすすめの記事

キャリアを考える

BACK TO TOP ∧

FOLLOW