ブログ記事Unityで洞窟を作るアドベントカレンダー2017naoこんにちは、アドベントカレンダー一日目担当のnaoです。今日は、私がよく使って遊んでいるUnity(ユニティ)のとある機能の話をしたいと思います。Unityってなんやねん?はい、そもそもUnityってなに?って思った方も多々いると思いますので、Unityの簡単な紹介をしたいと思います。Unityとは、簡単にいうとゲームを作るための無料ツール(道具)のことです。このUnityを使えば、簡単なゲームを割と誰でも作れますし、3Dゲームとか、VRも作れるツールなので、ゲームを作りたいという多くの人に使われていたりします。実はこのUnity、大手のゲーム企業でも結構使われています。多くの人が一度は聞いたことがある『PokemonGO』ですとかがそうです。VR』とかでも使われているそうですね。このUnity、3Dゲームを作るにあたって簡単に地形を作ることができます。山や谷などの地面の凸凹を簡単に仕込むことができるのです!ですが、実はこのTerrain、地形の形の高低を変えられるだけ(Heightmap)で、天井や壁の横方向への盛り上がりは作ることができません。洞窟が作れないんです!これでは、凝った探索ゲームや迷路、建物の内部を作ることができません。頑張ってもUnityの中に入っている、CubeかSphereというオブジェクトを複数個使って天井を作るしかないんです。これで洞窟を作るのは少々手間・・・いいえ、かなり手間です。そこで、今回私はどこかに天井、とりわけ洞窟を簡単に作る方法を探しました。洞窟作りの作戦さて、3時間ほどかけて私が調べた、または考えた方法を描いてみます。諦めるUnityのアセットストア(無料or有料のUnityに使えるものを販売しているサイト)から拾ってくる。Terrainを二重に重ねて洞窟を作ってみる。他の3Dモデル制作ツールを使ってMesh(見た目)を作って、当たり判定をUnity側でなんとかしてみる原子のように、小さい立方体を無限に作って重ねてそれっぽい空間を作る。いう方法が上がったので一個づつ試していきました。1.諦めるなんでこれが最初に上がったのか・・・。はい、これは一番最後に回しましょう。2.Unityのアセットストアから拾ってくる。Unityには先ほども言ったようにゲームを作りたいという多くの人に使われています。しても規模の大きいゲームになってくると必要な仕事量が増えていきます。いいプログラム書かなきゃ。建造物のオブジェクトが欲しい。必要なものはどんどん増えていきます。そんな方々によく利用されているのがアセットストアという、Unityで使用できるプログラム・3Dモデル・画像などを購入できるショップです。残念ながら、これの中には有料なものも多くあります。無料で提供されているとてもいい素材もまた多くあるので、とても便利なショップです。有料なのしか見当たりませんでした。安いのでも、だいたい20ドル(2000円程度)でした。ちなみに出来合いの割と良さげな洞窟を探してみますとだいたい60ドル(6000円程度)しました。たけぇ・・・さて、仕方がないのでこれらのツールのノウハウをパクれないかとそれらの説明を読んでみました。わかったのは、Terrainをプログラムでこねくり回してMesh(見た目)の機能の一部をTerrainに加えることで本来Heightmap(高さしか表現できない)であるTerrainに横穴を掘ったり、マインクラフトのようにCubeをたくさん繋げる形でいい感じの地形にしてみたり、と言ったようなものでした。私のプログラミング技術は低いです。よってこの手段はもっと時間のある時に、つまりはお正月にやってみよう。3.Terrainを二重に重ねて洞窟を作ってみる。次にTerrainを下図のように二枚重ねて天井を作れるかどうか試してみました。作ってみたところ、ダメでした。天井のTerrainの下からの当たり判定がガバガバで、Playerの挙動がおかしくなってしまうのです。天井を突き抜けて天井の上に乗り始めたりとかです。このTerrain、上からの当たり判定しか行わないのではないでしょうか。普通に上を歩くぶんには問題ないのに、その下からの衝突に関しては挙動がおかしくなるのではないのでしょうか。この案は完全にボツでした。4.他の3Dモデル制作ツールを使ってMesh(見た目)を作って、当たり判定をUnity側でなんとかしてみるさて今度はTerrainを使わずにやってみることにしました。Colliderという、見た目に使うMeshの面を当たり判定にそのまま使うことができるような、機能がありました。これを利用しましょう。Unityとは別物の、3Dモデル製作ツールでMeshを作ってみましょう。今回はBlenderを使いました。Blenderとは、3Dモデルを製作するためのソフトで、複雑な形状のモデルを作る時に使います。これでゲームに使う3Dモデルを作って他のゲームに移植する人も多いです。適当なオブジェクトを作ってみましょう。表側から法線を生やしてみるとこう見えます。これから作る洞窟はこの内側からみることになるので、この表裏をシューティングという、表裏を整えるツールで表をこのオブジェクトの内側に向け直しました。ちなみにですが、Unityではこの表側しかゲーム中ではみることができません。作るときは十分気をつけましょう。Colliderをつけて動かしてみましょう。はい、できちゃいました。洞窟を作る時に他の3D製作ソフトを使わなくてはならないという欠点はありますが、一番手間が少ない方法だと思います。やったね♪5.原子のように、小さい立方体を無限に作って重ねてそれっぽい空間を作る。最後にこの方法を試してみよう・・・と思いましたが、マインクラフトのCubeを小さくしただけだよね?っと気づいたので、この案を思いついた時に、どういう方針でやろうとしていたかだけ話しておこうと思います。小さな粒々(原子・ピクセル)でできてんじゃん!っと、まあ当たり前のことを思い出したからです。・・・はい、何この人当たり前のこと言ってんの?とかそんなこと言わないでくださいね。泣きますよ?で、この案ですが、たくさんの小さなCubeを積み上げて繋げて、洞窟のように見せ掛けようと考えていました。『積み上げていくアルゴリズムはどうしよう』という話です。ところで、皆さんはライフゲームというのはご存知ですか?ライフゲームとは縦横に碁盤状になっているセルを作り、そこにまず生きているセル(黒いセル)・死んでいるセル(白いセル)を作り、次のルールに従って数ターン繰り返す、という単純なゲームです。死んでいるセルに隣接する生きたセルがちょうど3つあれば、次の世代が誕生する。生きているセルに隣接する生きたセルが2つか3つならば、次の世代でも生存する。生きているセルに隣接する生きたセルが1つ以下ならば、過疎により死滅する。生きているセルに隣接する生きたセルが4つ以上ならば、過密により死滅する。このゲームを利用して、なんとか迷路風にマスを作れないかなぁ、と考えました。左上の図のような上下左右に特定方向にしか進めない迷路ではなく、斜めや画面向かって手前・奥方向にも進める迷路を作ろうと考えたんです。はい、本来2Dでするライフゲームを3Dで行なって、かつそれを元に迷路を作り出すアルゴリズムを作ろうとしたわけです。無謀じゃね?っと言ってて思います。『ゴリゴリやればできるんじゃね?』と思ってしまったわけです。うん、やる前に気づけてよかった。時間ある時にちょっとやってみたいかも。今日の私のブログはこれにて終わりにさせていただきます。これから毎日誰かがブログを上げていくので楽しみにしていてください。