見出し画像

蘇州紫夜 制作までの道のり

周りがツヨツヨ勢なので、非公式アドカレだけにしておけばよかったぜ!
cluster公式アドカレ18日目、熊猫土竜です。初心者向けだと思ってもらって…。

10月に公開したワールド「蘇州紫夜」(そしゅうむらさきのよる)が、clusterのお題企画「異世界を歩く」にて、なんと大賞を頂きました。
8月にスワンマン賞を頂き、次はグランプリということでありがたい限りです。

ちょうど、大賞発表の2日前にVulpeSさん主催のclusterワールド制作ゆるゆる勉強会でワールド軽量化について話をしたので、今回はそのあたりも含めワールド制作までの道のりをまとめます。
ちなみにゆるゆる勉強会の時の動画はこちらです。

私もだいぶ独学なので、間違っている情報があったり、もっといい方法があればぜひ教えてください!

毎度長すぎる前置き

今回のワールド、自分がパンダって名前なので中華風ワールドつくろうかな、と思いついたのが発端でした。clusterで中華ワールドと言えば、ゆるゆる勉強会でご一緒した41h0さんの空想九十份

など、いくつかはあるものの、あまり見かけないので、自分でつくろうかな、と。
最初は映画「酔拳」にでてくるような街並みをつくる予定でした。
「おまえにくわせるタンメンはねぇ」という人が出てきそうな。

ベースとなるアセットをストアで探し始めたところ、最初に出会ったのがこれでした。

雰囲気は近いものの、このアセットと出会ったことで酔拳から蘇州にイメージを変更。そこからはアセットストアで中華アセットの買いあさり。
水面に浮かぶ塔は若いころに旅した台湾の高尾龍虎塔

その他にも三国志のゲームや映画などでみた風景を詰め込み、開始から2日目にはほぼ大まかな形はできておりました。
私の場合はメインアセットを決めて、BGMを決めて、skyboxを決めて、そこから世界観をつくっていきます。
毎回、とにかく詰め込んでからライティングと軽量化をはじめるのですが…今までライティングはごかましながらやってきたこともあり、ここから半月ほどの格闘が始まります。

軽量化の基本

ここからはゆるゆる勉強会で使用したスライドを含め説明をしていきます。細かいところは他の方が詳細書かれていたりするので、そちらを紹介します。
まずお伝えしなければいけないのは、私自身Unity触り始めて1年の素人なので、必ずしも正しいとは言えないし、ほかにいい方法あれば教えてください、ということです。また軽量化が正義ではないので、あまりそこで神経すり減らさないことも推奨します。やりすぎてせっかくの美しさを損なうのも問題。
ただ、見た目ほぼかわらないのに無駄なところに容量増やすのはアップ時間も増えるし、ユーザーのDL時間も増える。ついでにclusterのサーバも圧迫するという、誰も得しない状況ではあると思います。

軽量化の基本はテクスチャの圧縮とCGモデルの圧縮です。

スライド3

テクスチャは検索窓で検索種類をテクスチャにするとすべて出てきます。

画像2

テクスチャが表示されたら圧縮したいテクスチャを選ぶとinspectorに設定項目が出てくるので、MaxSize、Compression、UseCrunchCompressionの設定を変えます。
初期では2048になっていることが多いですが、ここまでのサイズはまず必要ないです。(元からローポリのアセットで1枚のテクスチャに多くの模様が入っている場合は別)
ここは見た目とのトレードオフなので、模様が複雑なものや綺麗に見せたいものはNormal、粗くてもいいものはLowなどある程度決めちゃっても楽です。まとめて選んで圧縮できるので、まずは全部選んでまとめてLow、256、UseCrunchCompressionありで数値0にしてしまい、絵が崩れるところを見直していくというやり方でもいいかもしれません。

蘇州の場合は飾ってある絵や中華風壁紙などは圧縮をそこまでかけないようにしています。

モデルも同じように検索窓で検索種類をモデルにすればでてきます。

モデルの軽量化で一番重要なのはMeshCompressionです。ちなみに先ほどから出てくるCompressionというのは圧縮という意味です。com「ともに」press「押す」ion「こと、もの」が語源です。ついでに覚えちゃいましょう。

ここでひとつ罠です。テクスチャはHighよりLowのほうが圧縮されますが、モデルは逆になってます。また、モデルによってはHighにしてしまうことでテクスチャが崩れる場合があるので、この辺も実際に見ながら作業してください。(Vertex Compressionのほうがいいという記事もあるけど、よくわからないので詳しい方求む情報)

モデルの圧縮率を上げる際には、ついでにImport BlendShapesからImport LightsまでとRead/Write Enabledはオフ、Generate LightmapUVsはオンにしてしまうとよさげです。特にGenerate LightmapUVsはのちほどライティングを作る上では必須です。

また、マテリアルの数を無意味に増やすのはやめたほうがよいです。
例えばAのアセットで使っている木目調マテリアルとBのアセットに入っている木目調は別物として扱われるので容量が増えます。
似たようなマテリアルで使い合わしがきくなら同じマテリアルを使うことで容量もメモリも減らせます。

あと、clusterのコメントボード、ランキングボードは結構容量つかうので、イベント会場でもない限りは使用しないようにしましょう。イベントで使う場合でも通常版のワールドとイベント版のワールドで分けてアップするのをお勧めします。通常のワールドで全く使わないのに容量食うボードを置いておいても無意味です。

ワールドアップ前に、Dolphiiiinさんのこの記事を読んでBuild Report Inspectorを導入しておいてください。これを入れずにこの先語れません。なにが重いのかわからず暗中模索する必要がなくなります。

ここまできたら1回アップ。するとなにが重いのかわかるので、対策できます。よほど高画質な絵を飾りまくっているとか、こだわりとかがなければ、概ね100MB以下にはなると思います。ちなみに蘇州は40MB以下をキープしています。もっと軽くもできそうですが、自分の場合はこの辺で割り切ってます。
あと、音楽や効果音などの音もそのまま載せると高負荷な場合が多いので、クオリティを下げておきましょう。音に関しては下げてもあまり変化ありません。

ライティングについて

多くのビギナーワールドクリエイターを悩ませるのがライティングでしょう。私も悩みまくりました。
少し古いですが、こちらの記事で概ねできます。

蘇州を創る上で学んだライティングに重要なことは、ライティングする対象を決めることと、ライティングの解像度を決めることです。

スライド6

全部の箇所をライティングする必要はありません。狙いを決めましょう。
次に場所ごとにライティングの解像度を決めていきます。場所ごとというか正確にはオブジェクトごとですね。
解像度が高いほどきれいになりますが、その分容量が重くなるっていうのはマテリアルでも同じことでしたね。

まずは、解像度を可視化します。これをやると、ContributeGIのはずしもれも見つかるので便利です。

スライド7

白黒なので慣れるまでは見づらいのですが、ライトベイクをかけるオブジェクトのみを表示させることが可能です。
また、ベイクした時の解像度も同時にわかります。マス目が大きいほど粗く、小さいほど細かくきれいにベイクできるわけです。

スライド8

ここはそんなに明かりを綺麗に見せなくてもいいな、というところにおいては解像度を下げ、きっちり綺麗に見せたいところは解像度を上げます。
もちろん、綺麗な方がいいに決まっているので、ここは本当に出来上がりと容量との相談です。

スライド9

最後にワールド全体のライトマップ解像度を決めれば、あとはベイクするばかりです。ちなみに蘇州の場合、そこそこ広いですがベイクはCPUでも6分程度で終わります。
正直、私も蘇州で研究をして上記にたどり着くまで、ベイクには何時間もかかってました。8月にスワンマン賞を頂いた「君がいた夏は」でも、何度も何時間かかけてのベイクを実施してました。そんなもんかなぁという認識しかなかったのです。

ちなみに12月に公開したMOG aRAbianではBakeryにもチャレンジしています。特に影の出し方が綺麗。

蘇州紫夜もBakeryでやり直そうかという気持ちもありつつ、ライティングしなおすとなると大変なので躊躇。
Lightmap作成されたデータも様子を見つつ圧縮かけましょう。

広いワールドを目指す

ここからは特に遠景でつかうポイントです。
蘇州紫夜のあとに乗り物機能が付きました。乗り物も色々な使い方があると思いますが、やはり広大なワールドを目指したい!という方も多いのではないでしょうか。
広いワールド制作にはTerrainの自由な扱いがマストです。
高低差、テクスチャの重ね塗り、植物などが使いやすく、また地面や植物に対し、どれくらいの距離でどれくらい詳細見せるかというのも調整しながらできるのが魅力的です。
Terrainも場所によって解像度使い分けるなど細かいテクはあるのですが、今回のメインテーマである蘇州紫夜ではTerrain使っていないので省きます。

広いワールドをつくる時の基本はいかに遠くにあるものを描画せず、近いものだけを見せるか、です。目に見えないくらい遠くにあるものを細かく描いてもあまり意味がないわけです。Terrain設定でも重要な部分ですが、Terrain以外でもいくつかの方法で遠くのものと近いものの描画を変えることができます。

Level of Detail

その代表格がLODです。LODとはLevel of Detail、詳細のレベルのことです。
clusterにおいてはアバターのLODという部分でも聞き馴染みがあるかと思います。
ワールドにおいてもオブジェクトのLODを決めることが可能です。アセットによっては最初からコンポーネントとしてついている場合もあります。

スライド16

Unityにおいては標準装備されていますので、コンポーネント追加でLODと検索すれば出てきます。
LOD0がそのままの状態、つまり綺麗に見える状態で、LOD1が少しレベルを落とした、例えばポリゴン数を落としたモデル、Culledがなにも見えない状況となります。
そして、その割合を決めることができます。どういうことかというと、例えば建物の中にあるオブジェクトであれば、建物の中であるこの距離まではLOD0、建物外からここまではLOD1というように、ある程度好きな距離感でLODを決めることができるわけです。

さて、LODを設定するとなると、一つ問題がでてきます。
それぞれのレベルにあったモデルを用意しなければいけないということです。アセットに最初から入っていればいいのですが、ない場合にはポリゴン数を低くするなどして負荷を減らいたモデルを作らなければなりません。
また、それぞれのレベルのモデルをアップするため、その分わずかながらワールド全体の容量が上がります。

スライド17

そこで使える手が、LOD1、LOD2を省いてしまい、単純にLOD0かCulledの2択、つまり見えるか見えないかの2択にしてしまうことです。
蘇州紫夜ではエレベーターを降りたあたりでは街並みの大半を消し、バルコニーに出たあたりでは見えるようにしています。
※詳細は冒頭の動画をご覧ください。

これによって、遠くのものを読み込むことがなくなるため、その分スムーズに動けるようになります。
ただ、この方法だと物が現れたり消えたりするのが目に見えてしまうため、FOGなどをうまく組み合わせるとより効果的です。

ついでに描画処理の軽量化でいうとOcclusionもあります。こちらもUnity標準装備で使えます。目に見えているもののうしろにあるものは描かないという手です。
例えば、現実世界でトイレに入ってドアを閉めた時、トイレの外の世界って見えなくなりますよね。この時、本当にトイレの外に世界が存在しているのか?という世にも奇妙な物語は一旦おいといて、ワールドにおいてはそれが実現可能なのです。トイレの中から見た時に、外の世界を消してしまうことが。これならば、描画するのは目に見えている部分だけでいいので、負荷を減らせます。逆に言えば、何もしないと見えていない部分も描画してしまってるわけです。

ただ、このOcclusion。私はあまり好きではなく、蘇州紫夜でも使っていません。

スライド14

特に3人称で見た時に、カメラの位置によって物や人が消えてしまうことがよくあるからです。
Occlusionする高さ、つまりどれくらいの大きさのものを壁と認識するか、とかオブジェクトごとに壁と認識するもの、壁の向こうにある場合に消すもの、など細かく設定できるので、うまく使えば大変有効的です。

と、いうことで、先日ワールドクリエイター1周年を迎えて、ようやく初心者マークが外れた?私のワールド制作軽量化ポイントでした。
冒頭に書いたとおり、必ずしも軽量化が正解ではないし、もっと根本的なことで私が知らないこともあるかと思います。
そして、大事なのはあまり悩まずに自分がつくりたいもの好きなものを創ることだとも思います。

せっかくつくったのに、スマホで入れない、重くて人に来てもらえない、などの時には上記のことを少しでも参考にしていただければ!

この記事が気に入ったらサポートをしてみませんか?