sunarit’s blog

Unity開発の備忘録

【オススメ!】Erosion Brush

バージョン: 1.4

地形作成ツールである「Erosion Brush」を使用してみました。
以前紹介した「Gaia」のように、Unityには地形(Terrain)を作るのに便利なアセットがいくつもリリースされています。Asset Storeを見ていて、たまたま目に入り、チュートリアル動画を見て「これは便利そうだ」と思ったのが購入したきっかけです。

リリース直後から非常に多くのユーザーを獲得した「Gaia」はアップデートを重ね、リリース初期にはなかった自動地形生成機能も搭載されたりと、UnityでのTerrain生成ツールとして現時点でのスタンダードとなっています。これに比べ、「Erosion Brush」は自動地形生成機能はなく、あくまでユーザーの地形作成を助けるツールです。

「Gaia」があらかじめ用意されている地形スタンプをペタペタ押しながらイメージどおりの地形に仕上げていくのに対し、「Erosion Brush」はTerrainで大雑把なデザインを決めて、それを基にリアルな地形に変形させていきます。
チュートリアル動画を見ると分かりますが、非常に直感的でスピーディーに地形を作成しています。作りたい地形のイメージが明確に頭にあるのであれば、「Erosion Brush」の方が素早く作りやすいように見えます。

というわけで、「Erosion Brush」を1時間ほど使用し、ある程度操作を覚えてから実際に地形を作成してみました。この時点でかなり早く思い通りの地形を作成することができるのが分かったので、果たしてどの程度の時間がかかるのか実際に計測してみました。
お題として「山沿いの道 & 崖」という地形を作成します。

では、開始です。
(経過時間がわかりやすいように、上部に時計を置きました。シカゴ時間になっていますが、日本に設定するのが面倒だったのと経過時間さえ分かればいいのでそのまま続行しました)
f:id:sunarit:20160519225536p:plain


Create -> 3D Object -> TerrainでTerrainを設置し、Textureを設定します。
f:id:sunarit:20160519225537p:plain


UnityのTerrainインスペクターで適当にあたりをつけながら、起伏を設定します。
f:id:sunarit:20160519225538p:plain


「Erosion Brush」のNoise機能で大雑把に地形にノイズを乗せます。
f:id:sunarit:20160519225539p:plain


UnityのTerrainインスペクターで山の端を平らにした後、再度Noise機能で微妙な起伏をつけます。
f:id:sunarit:20160519225540p:plain


「Erosion Brush」のErosion機能でテクスチャーを貼りながら、地形の調整をします。
f:id:sunarit:20160519225541p:plain



UnityのTerrainインスペクターのSmooth機能も併用しながら、さらに微調整をします。
f:id:sunarit:20160519225542p:plain


完成です。
f:id:sunarit:20160519225543p:plain




15分足らずである程度イメージどおりのものが完成しました。もちろん実際にはテクスチャーの修正や、さらなる調整が必要だと思いますが、プロトタイプを短時間で作れるというのは作り込みの時間が増えることを意味しますので非常に大きなメリットです。

最後に、この地形をローポリ化し、前回の記事で紹介した「AQUAS」を入れ込んでiPhone6実機で実行してみたのが下のアニメーションGIFです。「AQUAS」で作った海面にはmeshfilterを動的に変形させて波っぽく見えるようにしています。
f:id:sunarit:20160520001051g:plain



「Gaia」とは異なるアプローチで地形を作成する「Erosion Brush」ですが、自分としては「Erosion Brush」の方が合っているように思いました。ただし、「Erosion Brush」には木を植えたり、オブジェクトを置く機能はありません。モバイルをターゲットにした場合、普通に木やオブジェクトを置いただけではパフォーマンスに如実に影響を与える可能性が高いため、そもそも「Gaia」使用時にはそれらの機能は使わず、スタンプによる地形作成とテクスチャーのスポーン機能くらいしか使っていませんでした。なので、それらの機能がなくても自分には問題ないのですが、人によっては重要な機能であるかもしれません。「Erosion Brush」の購入を検討している方は要チェックです。

Asset Storeで購入した価格は25USDですが、その価値は十分にあると感じました。もしかしたら、今後「Gaia」は使わないような気すらしています。

「Erosion Brush」のフリー版としてNoise機能のみを取り出した「Noise Brush」が公開されています。Noise機能だけあってもあまり使い道がないような気がしないでもないですが、気になる方は試してみてもいいかもしれませんね。

Asset Store

【オススメ!】AQUAS Water Set

バージョン: 1.2.2

以前のセール時に買っていた「AQUAS Water Set(以下、AQUAS)」を使ってみました。
ゲームのステージで海を表現したいと思ったことはないでしょうか?
そもそも水の動きというのは非常に複雑なものなので、コンピューターで表現しようとすると、とんでもなくCPUリソースを消費してしまいます。UnityにもWaterがStandard Assetで利用できますが、やはりCPUコストが高く、モバイルでの使用はかなり厳しいものとなっています。
今回使用してみた「AQUAS」は、モバイル用のシェーダが用意されているとのことなので、iPhone6実機で動作させて実用になるのかを検証してみました。

ただ単に海だけを作成しても実用的か否かを判断するのは難しいので、実際のゲームっぽいシーンを作成し、キャラクターを歩かせてみました。

今回使用したシーンを簡単に説明すると、
地形: Gaiaで作成したものをオリジナルのスクリプトで約2,400 Trisまでローポリ化。
キャラクター: 8,000ポリゴンくらい。
ヤシの木: 計135本表示しています。ローポリ化したあと、オリジナルのスクリプトでスキャッター。
という感じに、シーン自体は予めモバイル用に最適化しています。
ライトマップは使用していません。

結果は以下の動画のように、モバイルとしてはかなりキレイな海を作ることができました(アニメーションGIFなのでフレームレートがカクカクですが、実機では常に30FPS以上をキープしています)。
f:id:sunarit:20160516012909g:plain

気になるCPUコストもXcode上で5回ほど行った計測では、大体40%程度、海にオブジェクトが反射した際に50%程度、という結果でした。これなら十分使用に耐えられます。

使い方も非常に簡単です。
Quick Setupが用意されており、
1. 海面の高さ指定
2. Terrain指定
3. メインカメラ指定
4. Add Waterボタンをクリック
と、4ステップで簡単に海が作成できます。
今回のテストでは、このQuick Setupを使用して作成しています。

モバイルでも実用的なキレイな海が作成できる「AQUAS」ですが、欠点として波が上下しないことが挙げられます。AQUASでは波のうねりをパンプマップで表現しています。つまり、実際にはポリゴンを変形させていないので、かなり穏やかな海になってしまいます。トップダウン系ならそんなに気にならないと思いますが、FPSやTPS系などでは横から見ることになるので、気になるなら自力でなんとかする必要があるでしょう。

色変更や波のスピード調整、反射量などカスタマイズも充実していますので、きっとイメージに合う海や湖などが作れると思います。
通常価格は25USDと高くもなく安くもないですが、この機能なら十分買う価値アリだと思います。

Asset Store

【オススメ!】Text Mesh Pro

Unityでテキストメッシュ(Create -> 3D Object -> 3D Text)を使ったことがある方なら知ってると思いますが、なぜかエッジがボケます。
フリーフォントRounded M+をUnityに放り込んで、テキストメッシュを何も考えずに配置してみたのが下の画像です。
f:id:sunarit:20160225055515p:plain
見事にエッジがボケています。
これを直す方法として、「Font Sizeを思いっきり上げる & Character Sizeを思いっきり下げる」を満足いくまで繰り返す、というやり方があります。この方法を用いた結果が下の画像です。

f:id:sunarit:20160225055538p:plain
プレイヤーに不快感を与えない程度には修正できたかな、という感じです。

ここでふと、「なんなの、この作業!? 時間の無駄じゃないの!?」と思った方は、「Text Mesh Pro」を使えば一発解決できてしまいます。
下の画像は、「Text Mesh Pro」で作成した文字列のフォントサイズを調整し、ただ単に配置したものです。
f:id:sunarit:20160225055557p:plain

Font SizeやCharacter Sizeを調整し、試行錯誤していたのがバカバカしくなります。
もちろん、スクリプトからランタイムで変更するのも簡単です。Unity標準のテキスト関連メソッドとかなり似通ってますので、特に意識することなく使いこなせると思います。また、独自タグによる動的な色変えも簡単にできますし、グロウやベベルといった文字装飾にも対応しています。文字装飾機能を減らした軽量なモバイル用のシェーダも搭載しているので、UIも3Dテキストもテキスト関連ならなんでもござれ、というくらい万能なアセットです。

が、ひとつだけ気になる点があるとすれば、メモリ使用量が若干増えるというところです。というのも、この「Text Mesh Pro」は、付属のフォント作成機能を利用しフォント一覧のテクスチャーアトラスを生成して初めて使用できるようになるため、このテクスチャーのサイズに応じてメモリ使用量があがります。
日本語の常用漢字すべてをテクスチャー化する場合、2048 x 2048、もしくは4096 x 4096くらいのテクスチャーを生成しないとエッジがボケてしまいます。何らかの理由で数十メガバイトクラスの小さめのゲームを作らなければならない場合やメモリー使用量にシビアな場合には、あらかじめ使用する日本語文字を特定しておいて、それら必要な文字だけを512 x 512程度でテクスチャー化する、とっいたような昔のゲーム開発で用いられていたような工夫が必要となってくると思います。

現時点(2016/2/24)で未だにベータ扱いですが、すでに1年以上に渡り使用しており、バージョンアップも早く、今となってはなくてはならないアセットのひとつです。むしろ、このアセットが使えなくなったら、途方に暮れるレベルにまで依存してしまっています。正直な気持ちとしてはUnity側で3Dテキストのボケ問題に対して何らかの対応するべきだと思うのですが、何年も前から指摘されているにも関わらず未だに対応されていないことを考えると、「Text Mesh Pro」を購入してしまうのが精神衛生的にも良いと思われます。

価格は65USDと、安い部類ではありませんが、機能と便利さから考えれば決して高いとは思えません。uGUIの登場によって、UI目的では必要性が減ったとも言えますが、3D空間上にテキストを表示したいのであれば、「オススメ!」というよりも、「必須」ではないかと思います。

Asset Store

Web API Kit: Core

ここのところ、レベル作成やキャラクターアニメーションにかかりっきりで、全然新しいアセットを試していなかったのですが、2/22の24時間セールになっていた「Web API Kit: Core」を購入し、使ってみました。

前からやりたかったこととして、
・Webサーバーに置いたテキスト、および画像をリアルタイムでUnity側に取り込んで表示というのがありました。
Unity自身にもWWWというクラスがありますので、それを使えば実現できていたのですが、残念なことにネットワークというものは常に繋がっているとは限らないため、タイムアウト等の異常系に対してのエラー処理を書かないといけません。ちょっと考えてみたのですが、面倒そうなので棚上げにしていました。
この辺を簡単にしてくれるのが、「Web API Kit: Core」です。
似たようなことが可能なアセットとしては、「BestHTTP」という、ユーザー評価が高いアセットがありますが、価格が55USDとなかなかのお値段ですし、以前のセール時にスキップしていたこともあり、また、とりあえず上記のやりたかったことができればいいや、的な考えもありましたので「Web API Kit: Core」を選択しました。

実際にテストしてみた結果が以下の画像です。
下の画像は画像URLが未設定状態のものです。
f:id:sunarit:20160223084118p:plain

次の下の画像は、googleで「写真 フリー」で検索した結果の画像URLを設定したものです。
f:id:sunarit:20160223084136p:plain

最後の下の画像も、上の画像同様、画像URLを設定したものです。
f:id:sunarit:20160223084152p:plain

具体的な実装としては、あらかじめ複数の画像URLをstringでスクリプトに記述しておき、Unityの実行時にランダムで指定してWebから取得させるようにしています。画像はあくまでWeb上にのみに存在し、スクリプトには画像のURLパスのみが記述されています。
他にもJSONやOAuthにも対応しているので、使い方次第ではゲーム内で色々なことができる便利なアセットです。が、ちょっと気になった点として、入っているサンプルが分かりづらいという部分があります。というのも、サンプルのスクリプトがnamespace(名前空間)を多用しているため、読み解く際に、あっちのファイルを開いて、次はこっちのファイルを開いてと、オリジナルのカスタムクラスを作成するまでに数時間を費やしてしまいました。
一度、構造さえ理解してしまえば、ほぼ同じ手法で画像やテキストだけでなく、様々なデータをWebサーバーから取得できるようになります。当初やりたかった事はテキストや画像のWebサーバーからの取得&エラー処理なので、少々オーバースペックとも言えますが、今後、何かの役に立ちそうな気もします。むしろ、ただ単にテキストや画像を取得するだけのために購入する方が少ないのでしょう。

購入時はセール価格でしたので、15USDでしたが、通常は30USDです。
あくまでドキュメントを読んだ限りですが、「BestHTTP」の方が簡単に使えそうに見えました。「Web API Kit: Core」の購入を検討されている方は、一度、ドキュメント等に目を通すといいと思います。

Asset Store

Horizon[ON]

しばらく前にセールで購入していた「Horizon[ON](Asset Store)」を使用してみました。
このHorizon[ON]で何ができるのかと言うと、(若干語弊がありますが)地平線を作れるツールです。FPS系のレベルデザインにおいて、悩みどころのひとつが地平線の表現です。家の中や街の中など、壁やビル等のオブジェクトで囲めるところであればあまり問題にはなりませんが、Terrainで表現するような自然景観系では地平線をどう表現するかが問題になります。

解決策として、
1) 高い山で囲んで遠くまで見通せないようにする
2) プレイヤーの動ける範囲 + 視界よりも巨大な地形を作成する
3) ローポリ化した巨大地形を置き、背景として使用する
4) カメラ設定とFog設定で地平線をぼかす
5) Skyboxに直接描く、テクスチャーを置く
6) 距離に応じてブラーをかける
などなど色々な手法があります。
ただ、モバイルをターゲットにした場合、2)の巨大な地形を作成したり、6)のブラーをかけたりするのはスペック的に不利のため、あまり現実的とは言えません。また、1)の高い山などで視線を制限するのもレベルデザインの固定化につながりますし、4)のカメラ設定のClipping Planesの値を調整するのも、小さくしすぎると不自然に見えてしまいます。5)のテクスチャー化ですが、いわゆる書き割りなので上手く遠近感を出して描かないとやはり不自然に見えてしまいます。そして、残った3)のローポリ化した巨大地形を置く、を簡単に行ってくれるのがHorizon[ON]です。

下の画像はGaiaで作成したTerrainです。Terrainサイズは 2048、ほぼ中央にカメラを置き、Clipping Planes - Farは3,000です。軽量化のために、Terrainはローポリ化しています。完全に地形の端が見えています。低い場所のみプレイヤーが移動するなら問題ありませんが、高い所に登れるようだと、このように端が見えてしまいます。
f:id:sunarit:20151221044907p:plain

そして、次の下の画像は上のシーンにHorizon[ON]を適用してみた結果です。なんとなくいい感じになりましたが、Clipping Planes - Farの値が小さいために、まだ地形の端が切り取られたように見えている箇所があります。
f:id:sunarit:20151221045315p:plain

Clipping Planes - Farを16,000にしたのが下の画像です。
f:id:sunarit:20151221045100p:plain

こんな感じで地平線を簡単に作りだせるHorizon[ON]ですが、気になるのはパフォーマンスです。
実際にiPhone6上で動作させ、周辺を歩き回った際のXcode上での平均CPU使用率は、
Terrain(ローポリ化後) + FPSキャラクター: 約33%
Terrain(ローポリ化後) + Horizon[ON] + FPSキャラクター: 約35%
という感じでした。誤差範囲かもと思わせるくらい、Horizon[ON]は軽いものでした。今回はシェーダーや(Terrainのローポリ化以外の)メッシュの最適化は行っていませんので、さらに調整すればCPU使用率30%を切るか切らないかくらいまで下げることが可能かもしれません。
余談ですが、ローポリ化していないTerrainでのCPU使用率は以下のとおりでした。
Terrain(ローポリ化前) + FPSキャラクター: 約71%
Terrain(ローポリ化前) + Horizon[ON] + FPSキャラクター: 約73%
Horizon[ON]がCPUに与えている影響はかなり低いということが改めて分かります。

レベルデザイン時に地平線をどうするかでお悩みの方にオススメです。

追記: 偶然にも本日(12/22)の半額セールになってます。興味のある方はお早めに!

[Unity5対応]
Asset Store

【オススメ!】Gaia

10月末に発売された「Gaia」を使ってみました。
前回の記事でも書きましたが、「Gaia」はUnityのTerrain生成ツールです。

「Gaia」の地形生成方法はとても簡単で、以下のような感じです。
1. 用意されているスタンプ画像を選択
2. 位置やサイズなどの調整
3. Stampボタンを押す
この1〜3の流れを繰り返していくことで、結果を見ながら直感的に地形を作成することができるようになっています。
用意されているスタンプ画像も予め複数のものが用意されており、それらだけでも十分理想に近い地形を作成することが可能だと思いますが、付属のScanning Systemを使用してオリジナルのスタンプを作り出すこともできるようになっています。
好きなだけ1〜3を繰り返したら、あとはSpawnerボタンを押すだけで「Gaia」が自動で地面テクスチャを貼り、木や草などをそれっぽく配置してくれます。

10分程度時間をかけて作成したのが、以下の地形です。
f:id:sunarit:20151102050159p:plain

f:id:sunarit:20151102050207p:plain

適当にスタンプをペタペタ押していくだけで、デフォルト設定でここまで作れてしまいます。
Unity自身でもTerrain設定からHeightmapを読み込んで地形を作ることが可能ですが、テクスチャーを含めて最終的な形まで持っていく作業を考えた場合、圧倒的に「Gaia」の方が早く簡単に地形を作ることが可能です。
もちろん、モバイルをターゲットにするのであれば、「Gaia」のデフォルト設定でのクオリティーでは無理があるので、「Gaia」自身に用意されている設定項目を調整する必要があります。とは言っても、そもそも「Gaia」が生成するのはUnity準拠のTerrainということもあり、「Gaia」自身が持っている調整項目は、Unityが持っているTerrainの設定項目+アルファとなっています。
このUnity準拠のTerrainというのは、非常に大きなメリットです。「Gaia」で大まかな地形を作成した後、Unity側のTerrainインスペクタから微調整をする、というのも可能ですし、他アセットとの親和性も高いと言えます。少なくとも「SECTR COMPLETE」でのチャンク化、ストリーム化は、通常のTerrainと同様、何の問題もなくできました。

「Gaia」は、1クリックでTerrainを自動生成してくれるツールではありません。あくまで、ヘルパー的に作業を手助けしてくれるツールです。ですが、UnityのTerrainインスペクタを使用してコツコツと作っていくのがバカらしくなるくらい、劇的に早く簡単にそれなりの地形が作れてしまう非常に便利なツールです。
この記事を書いている2015/11/4現在、リリース記念として一週間限定価格25USD(通常価格は65USD)となっています。リリース日から換算すると、2015/11/5頃には通常価格に戻ってしまうと思うので、Terrain作成でお悩みの方はお早めに!

Asset Store

Gaiaリリース

今年の夏頃から話題になっていた「Gaia」がリリースされました。
発売直後にも関わらず、すでに売上トップになっています。
f:id:sunarit:20151030015513p:plain

どんなアセットかと言うと、いわゆるTerrain生成ツール(というよりもヘルパー)です。
UnityのTerrainはまっさらな紙の上にペンで地形を描くようなイメージで作りますが、あまりにも自由度が高すぎてデザインセンスがないとイマイチでリアリティのない地形になってしまいます。
この悩みを解決してくれるのが「TerrainComposer」を始めとしたTerrain生成ツールです。
ほぼ一強とも言える「TerrainComposer」は、とんでもなく高機能だけどかなり独特な設計思想とパラメーターの多さから理解するまでの試行錯誤が大変で、さらにモバイルをターゲットに調整しようとすると「TerrainComposer」らしさ(特にテクスチャーのスプラットなど)があまり生かせない、という難点があります。

そんなTerrain生成ツールカテゴリーに現れたのが「Gaia」です。
1ヶ月くらい前にベータ版を制作者からもらうことができ、「SECTR」と組み合わせてテストで使ってみましたが、使い始めて2時間後には「正式リリースされたら購入しよう」と決めたくらい便利なツールでした。
あくまでベータ版での話ですが、生成結果は「TerrainComposer」に劣るものの、使い勝手やモバイルターゲットを念頭に置くなら「Gaia」は選択のひとつして大いにアリだと感じました。
ただ、あくまで作業を楽にしてくれるツールなので、「1クリックで自動生成」というようなものではないという点は要注意です(正式リリース版でそんな機能が実装されていなければ、の話ですが)。

もちろん私も早速購入しましたので、後日、正式リリース版を使用してのインプレッションなどを書きたいと思います。
ちなみに、リリース後一週間は特別価格25USD(通常価格65USD)なので、気になる方はお早めに!

Asset Store