こんにちは、アドベントカレンダー一日目担当のnaoです。
今日は、私がよく使って遊んでいるUnity(ユニティ)のとある機能の話をしたいと思います。
Unityってなんやねん?
はい、そもそもUnityってなに?って思った方も多々いると思いますので、Unityの簡単な紹介をしたいと思います。
Unityとは、簡単にいうとゲームを作るための無料ツール(道具)のことです。
このUnityを使えば、簡単なゲームを割と誰でも作れますし、
3Dゲームとか、VRも作れるツールなので、ゲームを作りたいという多くの人に使われていたりします。
実はこのUnity、大手のゲーム企業でも結構使われています。
例えば、株式会社コロプラさんの『白猫プロジェクト』ですとか、
多くの人が一度は聞いたことがある『PokemonGO』ですとかがそうです。
そうそう、12月に配信される『Fate/Grand Order VR』とかでも使われているそうですね。
さてこのUnity、3Dゲームを作るにあたって簡単に地形を作ることができます。
この地形、特に地面の盛り上がりなどはTerrainというUntiyの中に入っているオブジェクトを使っており、
山や谷などの地面の凸凹を簡単に仕込むことができるのです!
ですが、実はこの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を使わずにやってみることにしました。
幸いUnityにはMesh Colliderという、見た目に使うMeshの面を当たり判定にそのまま使うことができるような、機能がありました。
これを利用しましょう。
まずはUnityとは別物の、3Dモデル製作ツールでMeshを作ってみましょう。
今回はBlenderを使いました。
Blenderとは、3Dモデルを製作するためのソフトで、複雑な形状のモデルを作る時に使います。
これでゲームに使う3Dモデルを作って他のゲームに移植する人も多いです。
さて、とりあえずは適当なオブジェクトを作ってみましょう。
形はこれでよし。こういうオブジェクトには表裏があって、
表側から法線を生やしてみるとこう見えます。
これから作る洞窟はこの内側からみることになるので、この表裏をシューティングという、表裏を整えるツールで表をこのオブジェクトの内側に向け直しました。
ちなみにですが、Unityではこの表側しかゲーム中ではみることができません。
作るときは十分気をつけましょう。
さて、出来上がったモデルをFbx型で保存してUnityに移植、Mesh Colliderをつけて動かしてみましょう。
できた。
はい、できちゃいました。
洞窟を作る時に他の3D製作ソフトを使わなくてはならないという欠点はありますが、一番手間が少ない方法だと思います。
やったね♪
5.原子のように、小さい立方体を無限に作って重ねてそれっぽい空間を作る。
さて、最後にこの方法を試してみよう・・・と思いましたが、マインクラフトのCubeを小さくしただけだよね?
っと気づいたので、この案を思いついた時に、どういう方針でやろうとしていたかだけ話しておこうと思います。
そもそもこの案を思いついたのは、
この世界って、
小さな粒々(原子・ピクセル)でできてんじゃん!
っと、まあ当たり前のことを思い出したからです。
・・・はい、何この人当たり前のこと言ってんの?とかそんなこと言わないでくださいね。泣きますよ?
で、この案ですが、たくさんの小さなCubeを積み上げて繋げて、洞窟のように見せ掛けようと考えていました。
で、考えるべき問題が、
『積み上げていくアルゴリズムはどうしよう』
という話です。
ところで、皆さんはライフゲームというのはご存知ですか?
ライフゲームとは縦横に碁盤状になっているセルを作り、そこにまず生きているセル(黒いセル)・死んでいるセル(白いセル)を作り、次のルールに従って数ターン繰り返す、という単純なゲームです。
- 死んでいるセルに隣接する生きたセルがちょうど3つあれば、次の世代が誕生する。
- 生きているセルに隣接する生きたセルが2つか3つならば、次の世代でも生存する。
- 生きているセルに隣接する生きたセルが1つ以下ならば、過疎により死滅する。
- 生きているセルに隣接する生きたセルが4つ以上ならば、過密により死滅する。
さて、このゲームを利用して、なんとか迷路風にマスを作れないかなぁ、と考えました。
左上の図のような上下左右に特定方向にしか進めない迷路ではなく、斜めや画面向かって手前・奥方向にも進める迷路を作ろうと考えたんです。
はい、本来2Dでするライフゲームを3Dで行なって、かつ
それを元に迷路を作り出すアルゴリズムを作ろうとしたわけです。
無謀じゃね?
っと言ってて思います。
しかし、ライフゲームを利用した2Dの迷路を作っている人も見つけてしまったため、
『ゴリゴリやればできるんじゃね?』
と思ってしまったわけです。
うん、やる前に気づけてよかった。
でも、時間ある時にちょっとやってみたいかも。
と思っています。
最後に
はい、アドベントカレンダー初日から長くなってしまいましたが、
今日の私のブログはこれにて終わりにさせていただきます。
これから毎日誰かがブログを上げていくので楽しみにしていてください。
それでは、また。
明日の担当は satoriku です。