読者です 読者をやめる 読者になる 読者になる

遊べるゲームを作りたい

作りたいです。

7つめできた Unityで島を作りたい

f:id:hogemarunosuke:20170123001928p:plain

 PrimitiveIsland

https://hogemarunosuke.github.io/WebGL/PrimitiveIsland/

 遊び方

WASDキーで移動。スペースキーでジャンプ。マウスで視点移動。
左クリックで射撃。赤八角柱を倒して加点、触れるとゲームオーバー。

 島を作る

Unityで地形を作るにはTerrainを使いますが 、エディタにある標準機能ではいまいち使いづらいので手ごろなものを探すことにしました。今後もWebGLでビルドしていくことを考えると、ローポリで生成できるものがGOOD。

f:id:hogemarunosuke:20170123003554p:plain

てことで見つけたのがコレ。「Low Poly Terrain」まんまのローポリ。少々お高い買い物でしたが末永く使って行けそうです。ビデオチュートリアルもわかりやすい。

使い方はいたって簡単です。地形の高低差を表す画像A(黒:低い、白:高い)、地形の色を表す画像Bをそれぞれ用意し、コンポーネントにセットして生成ボタンを押すだけ。チャンク幅やランダム閾値などのパラメータをセットすることで、手軽にナチョラルな地形を作り出すことができます。

あまり声を大にして言うことはできませんが、Googleなどで衛星写真を見つけてきて、フォトショなどでグレースケールに変換したあと、良い感じにぼかしたり色調変換することで、そのまま3Dモデルに落とし込めたりします。便利~。

f:id:hogemarunosuke:20170123005050p:plain f:id:hogemarunosuke:20170123005319p:plain

今回は島を作りたいので、フォトショで塗り塗りっと入力画像を作成(左が画像A,右が画像B)。絵心がない私でもこれぐらい描けます(震え声

f:id:hogemarunosuke:20170123005737p:plain

で、お出しされた地形がこちら。・・・うん、島だね。見まごうことなき島だね。真空パックされた冷凍ハンバーグみたいだけど。

f:id:hogemarunosuke:20170123010442p:plain

ぬぐいきれない違和感を払しょくするために、StandardAssetsのWaterを追加。日中用とか夜用とか超リアル用とかありましたが、軽さ重視で軽めのやつに。おお、それっぽくなった!

f:id:hogemarunosuke:20170123010949p:plain

あとはいつも通りに光源とSkyboxを設定してできあがりです。うむランダム地形のデコボコ具合がいい感じだ。けど、水平線がくっきりすぎてちょっと違和感があるかも。

f:id:hogemarunosuke:20170123011119p:plain

というわけで、初めてUnityのFog機能を使ってみました。スゴクイイ。太陽の反射とかも表現したかったですが、それは今後の課題として残しておきます。

レティクルに向けて即着弾しないショットを撃つ

即着弾"する"ショットの実装は簡単です。レティクルのスクリーン座標(画面中央)にRaycastを飛ばして、オブジェクト上にヒットした座標に何かしらエフェクトを表示するだけ。で、即着弾"しない"ショットはどうするの? これの実装に悩みました。

レティクルのスクリーン座標(画面中央)にRaycastを飛ばす、までは同じで大丈夫そうですが、オブジェクトが存在しない方向(Skyboxとか)にも、きちんとショットを飛ばす必要があります。けど、Raycastはそこにオブジェクトがないと何も取得できない。うーん、困った。

f:id:hogemarunosuke:20170123014339p:plain

なので苦肉の策。プレイヤーの周りを透明のオブジェクトで囲って(子オブジェクトにして)、そこにRaycastを当てて、ターゲット座標を取得するようにしました。プレイヤーと囲いの間に他のオブジェクトが割り込んでくることもあるので、RaycastAllで貫通取得し、ネームタグでフィルタリングをします。

ターゲット座標が取得できたら、プレイヤー座標との差分をNormalizeして移動速度をかけてショットの移動量にセットすればOK。

なんだかすごい周りくどい手段を取っている気がしてなりませんが、望み通りの挙動で動いているので良しとします。Rigidbodyの作用とかでいいのかなぁ・・・。けど回転とか向きとか面倒だし・・・。

ちなみに、プレイヤー(緑色の球体)自体はUnityのCharacterControllerで動かしています。ジャンプ中の挙動がプルプルしたり、他オブジェクトの作用を受けられなかったりと、何かと融通が利かないところがありますので、今後の課題は、プレイヤー操作周りをRigidbodyで独自実装することでしょうか。