見出し画像

MeshBakerの罠と私なりのワークフロー

はじめに


今月のワールド製作者向け記事は、MeshBakerについて解説したいと思います。

MeshBakerはマテリアルとメッシュを結合して、軽量化をしてくれるUnityの有料アセットになります。ですが、非常に罠が多いツールでもあると思っています。
(一体何度、作業時間が虚無と化したことか……)
(その割にはオススメだよ!って言われてるのが凄く謎)

とはいえ、私は何度かこのツールから脱却を図るため色々なアセットを買いましたが、残念ながらこれほど高機能なツールはなかなかないんですよね……。

ですので、極力使わないことをお勧めしたいのですが、どうしてもマテリアルを纏めないといけない局面が発生することはあります(Vket用ブースのバッチ数を抑えたい時など)

この記事では気を付けるべき罠や、それを回避するための私流ワークフローを書きます。

MeshBakerを使うその前に……

単に軽量化したいという意図で、最初にMeshBakerに挑戦するのはお勧めしません。私の中ではMeshBakerの利用は軽量化の中でも最終手段に相当します。

大きな理由としてはマテリアルの結合がセットになっているためです。

マテリアルの結合には非常に気を使う必要があります。
マテリアルごとの見た目(色・艶・発光)が全く違う場合があるのに、それをまとめようというのですから、ある種の必然です。

MeshBakerはこれをイイ感じに結合してくれるツール……では全くないので気を付けましょう(ユーザが注意する必要があります)

その点、メッシュの結合は見た目の差異はありません。
メッシュはただの形状データですので、統合するにあたって困るような差異は基本的にありません。

したがって、もしただ単に軽量化したいのであれば、まずメッシュの結合だけ試してみるのがお手軽かつお勧めです。

メッシュの結合は拡張エディタでも可能ですので、無料のものも結構ありますが、UV2の取り扱いが大変なのでそこら辺をしっかりやってる無料アセットは中々ないかもしれません(下記のスライドがとても参考になります)

私は基本的にUnityの有料アセットを使っていて、以下の2つを使っています。この二つはUV2を考慮できる設定があります。
・多機能で痒い所に手が届くMesh Combine Studio2(オススメ!ただし項目が多い)

・シンプルに結合したい時用にEasy Combine(項目が少なく、比較的分かりやすい。時折失敗するので少数のものを結合するときに使用)

MeshBakerの使い方について


実は今回、使い方について分かりやすく説明する気はありません。何故なら、MeshBakerについて纏められている記事は非常に多いからです。

とりあえずVketが用意してくれてるMeshBakerの記事を読みましょう。話はそれからです。

手順についてはこれで事足りるのですが、そこに書いていない罠が結構あります。

今回はそこについて語った上で、私流のワークフローを書きます。

MeshBakerを避けたい理由

今まで一度もMeshBakerを使ったことが無い人は、何故私がここまでお勧めしないか、がピンと来ていないと思います。その理由について先にお話しします。
(既に使ったことのある人はこの章をスキップしていただいて結構です)

理由は以下の三つです
①処理時間がかかるため、リトライが辛い
②上手くいかなかった原因探しが辛い
③設定するべき項目が多く、ケアレスミスがあり辛い

それぞれ説明しようと思います。

①処理時間がかかるため、リトライが辛い

MeshBakerで複数個のものを結合しようとする時、テクスチャの数に応じて相応の時間がかかります。

結合しようとしてるテクスチャが多いときは、平気で5分以上時間がかかります。

そして、その間Unityが使えないので、作業が中断します。終了時間は表示されないので、いくら時間がかかるかは分かりません。この時点でしんどさが伝わると思います。

で、本題はそこからで何かしらの理由で失敗した時です。またUnityを使えない虚無の5分間(あるいはそれ以上)が訪れるわけです。

いや~しんどいですね……私はこれが辛くてしょうがないです。

俗にいう死に覚えゲーをやったことがある人はご存じだと思います。
人間、即座に続けて挑戦する分には気持ちが続くんですが、時間が空いてしまうと醒めてしまうんですよね。

この1点は本当にMeshBakerをお勧めしないポイントです。

②上手くいかなかった原因探しが辛い

何か途中まで上手くいってたのに、いざベイクボタンを押したらエラーが出ることとか平気であります。またはベイクボタン押したら、見た目がエグイくらい変わってしまっていたり……。

実はMeshBakerでは、結構よくある話です。
なのですが、ツールの複雑さゆえ、何が原因でそうなってしまったのかを突き止めるのが結構難しいです。

設定ミスの場合もありますし、結合させてはいけないものを結合してしまってる場合もありますし、ポリゴン数が多すぎなんて場合もあります。

が、それを検索するのはとっても難しいんですよね。なんて調べたらいいか分からないのも辛いポイントです。

③設定するべき項目が多く、ケアレスミスがあり辛い

私はワークフローを工夫することで対処していますが、1個設定を間違えただけで変な見た目になってしまい、望んだ結果が得られないことが結構あります。

ワールドのような規模になると、複数回MeshBakerを使用しないといけないこともあるので、ワークフローを工夫してない時はちょくちょくミスって、作業時間を虚無に食べさせてました。分かっててもミスるのは大分精神にきます。

MeshBakerの罠について

さて、ここからはMeshBakerの数々の罠について個別に説明していきたいと思います。多少恨み辛みが漏れてしまっているかもしれませんが、見逃してください。

・混ぜるべきではないマテリアルがある
例えばStandardシェーダーでmetalicのパラメータが違う2つのマテリアルがあるとします。金属質でピカピカしているやつ(Metalic = 1)と全く艶のないやつ(Metalic = 0)の二つです。

これを一つにするとき、MeshBakerはどうするかというと、平均します。

ぱっと見よく分かりにくいかもですが
パラメータはこの通りです

つまりピカピカだったゲームオブジェクトも全く艶のないオブジェクトも、中間のテカリ具合になります。

これはMetailicのパラメータに限らず、全てのパラメータに対して言えることなので、マテリアルカラーなどでも同じ現象が起こります。

赤と青が平均されて
結合後は紫になっています

これらを良い感じにやってくれるBlend Non-Texture Propertiesという機能があります。例えばマテリアルカラーで違う色を付けた、Metalicとテクスチャが違う以下のようなマテリアルがあったとします。

以下のBlend Non-Texture Propertiesにチェックを入れてベイクします。

すると全く同様の結果が得られます。

これはようは以下のようにテクスチャにプロパティの成分を焼きこんでくれる機能です。

マテリアルカラーが焼きこまれたテクスチャ
メタリックのマスク画像

『なーんだ!!これをしとけば問題ないじゃん!!』
……と思うかもしれませんが、これが使えるのはStandardシェーダーを含むごく一部のシェーダーのみです。

というか、他に対応しているのって古いシェーダーや、URPやHDRPといったVRChatに対応していないシェーダーなので、実質Standardシェーダーのみと言っても過言ではないと思います。

この機能を利用するにはシェーダーごとにカスタマイズしたTextureBlenderスクリプトが必要になります。Standardシェーダーについては既に用意されていますが、他のシェーダーについては自分で用意する必要があります。

スクリプト見れる人は既存のものをコピペして、改変すればいいのですが、そうでない人のほうが多いと思います。

そのような人達に出来る対策は2択だと思います。すなわち、Standardシェーダーを使うか、同じシェーダーで違うパラメータを持つマテリアルは混ぜないようにして結合することです。

(余談:Standardと同類のシェーダーだと互換性のためにプロパティが共通化されてる傾向があると思うので、もしかしたらスクリプトの改変はそこまで手間ではないのかも?)

・ライトマップの設定がデフォルトで無視されている
ライトマップの設定はデフォルトで無視する設定(Ignore_UV2)になっています。記事によってはGenerate_new_UV2_layoutにしようね、みたいなものを見かけることがありますが、MeshBakerを信用できるならそれでもいいと思います。
(Generate_new_UV2_layoutはMeshbaker側で、新しくUV2を再生成します)

私は過去の経験から全く信用していないので、UV2が無いオブジェクトはGenerate Lightmaps UVsで生成を行った上で、Copy_UV2_unchanged_to_separate_rectsを選択しています。このオプションだと特に余計な手を加えられないので、一番気楽です。

Preserved_Current_Lightmapは後でライトベイクしなおすことが出来なくなるので論外。焼きなおそうとしてもUV2がないので、そもそも焼けないはずです。

Copy_UV2_Unchangedは、UV2をライトベイク以外の用途に使っている場合の項目なので、非常に紛らわしいですがこれも論外です。

したがってライトベイクしたい場合はGenerate_new_UV2_layoutか、Copy_UV2_unchanged_to_separate_rectsのどちらか2択になります。

ただし、UV2の無いメッシュが紛れ込んでると以下のようなエラーが出て、ライトベイクしようとしてもできないので注意してください。

『UV2何それ……?でもライトベイクってやつはやりたい!』って方は以下の記事に初心者向けに解説しているので読んでみてください。ここでは説明しません。

追記:Scale in Lightmapを考慮してくれてると思っていたのですが、どうやらそうではないらしいですね……うーん……MeshBaker君……

・頂点数65535の壁
Unityがスクリプト内で一度に扱えるメッシュの頂点数の上限は基本的に65535です。MeshBakerではこれに対する対策としてMulti Mesh&Texture Bakerを使ってねと言っています(MeshBakerのマニュアル等では"64k"つまり64000という表記になってますが、Unityのリファレンスに表記を合わせているみたいです。実際は65535のようです)

では、普通のMesh&Texture Bakerでベイクしたら、どうなるんでしょうか?

実は最後にベイクボタンを押したときにようやくコンソールにエラーが出てくる程度で、分かりやすいポップアップとかは一切ありません。

しかも私が今回検証した中では、普通に白アイコンで如何にも成功しましたよみたいなツラをしているときもありました。実際は失敗していて、オブジェクト1個分のメッシュしかなかったです……。
(オブジェクト1個で90418個の頂点を試しに持たせたとき)

ですが、これはあくまで”Bake Mesh Assets In Place”オプションでメッシュの書き出しをする場合の話です。

”Bake Into Scene Object”でシーン上のゲームオブジェクトとして書き出す場合や、”Bake Into Prefab”でPrefabとして書き出す場合は、65535を超過していても、問題なく書き出せます。……なんで?
(インデックスバッファを32bitに拡張しているのかなと思うのですが、詳細は不明です。それならそもそも全てそうして欲しいですよね……)

ちょっと紛らわしくなってしまったので、以上を踏まえた結論を以下に示します。

Multi Mesh Bakerを使う必要はおそらく一切なく、普通のMesh &Texture Bakerを使用して、
メッシュの出力が必要ない場合→Bake Into Scene Object
メッシュの出力が必要である場合→Bake Into Prefab
で良いんじゃないかなとおもわれます。
(Multi Mesh Bakerのほうが良いケースがあれば、コメント等で指摘いただければ修正しますが、今のところ特にないように思えます)

(余談:このポリゴン制限はUnityのリファレンスを見るとStatic batchingの頂点上限にもかかわってきていて、上限を超えると自動的にメッシュが分割されて、バッチが分けられます。

とはいえ、自動でメッシュが分割されてバッチが分かれるので、わざわざ自分で分割する必要はないように思えます)

・ピックアップするオブジェクトはメッシュ結合しない

これは初心者の方は引っかかりそうだなーと思ったので解説しておきます。

ピックアップの対象になるのはメッシュ単位なので、MeshBakerでメッシュをまとめてしまうとまとめたメッシュ全てを持つことになってしまいます(そもそも結合した時点では、結合後メッシュにピックアップ系コンポーネントを付けなおさないと持てないとおもいますが)

そもそも全て同じ方向に動くような、纏めて動かしても問題ない場合はそれでも大丈夫かもしれません。

そうでない場合はピックアップするオブジェクトは纏めないようにしましょう。ちなみにアニメーションさせるオブジェクトとかも同様です。

Udonギミックがあるオブジェクトもモノによりますがやめておいたほうが無難だと思います。

・カスタムシェーダーのテクスチャは、デフォルトだと上手くまとめられない可能性がある

マテリアルには設定できる項目が沢山あると思います。

この一つ一つはシェーダーのプロパティと呼ばれるもので、シェーダー内部で定義されている名前があります。例えば、StandardシェーダーにおけるAlbedoのところのテクスチャは”_MainTex”というプロパティ名があります。
(何となくそんなものがあるんだなーくらいの認識で大丈夫です)

ここから重要なのですが、Mesh Bakerがまとめてくれるテクスチャはこのプロパティ名を参照して、テクスチャを纏めます。

つまり、誰かが作ったシェーダーでプロパティ名が独自の変な命名になっていると、そのテクスチャは纏めてくれません。

一般的にStandardシェーダーに倣って命名されていれば、MeshBakerが自動で検出してくれるので問題ないのですが、そうではない場合は上手くまとめてくれません。

纏めてほしい場合はMB3_Texture BakerのMaterial Bake Optionsの中にCustom Shader Property Namesという項目で、プロパティ名を入力してあげる必要があります。

プロパティ名の確認方法としては、該当のシェーダーファイル(虹色のアイコンにSの文字のファイル)をクリックすると、以下の画像のようにプロパティが表示されます。

左側がシェーダー内での名前なので、それを入力すればOKです。アンダーバーも名前の一部なので忘れずに。テクスチャは右側のところで括弧書きで(Texture)となってるので分かると思います。

・HeightMapテクスチャが苦手

Standardシェーダーにはハイトマップと呼ばれる機能があります。

プレイヤーの視線方向とテクスチャで用意した高さ情報で、いかにも凹凸があるかのようにUVをずらして見せかける技術なのですが、MeshBakerのアトラス化テクスチャに対して相性が悪いので、以下の画像のように隣のテクスチャが見えてしまいます。

MeshBaker側の機能で、これを解消するための設定があれば良いのですが、私の知る限りそういう機能はありません(そもそも、アトラス化自体タイリング出来なくなる技術なので、相性が悪いどころか相反する技術な気がします)

ですので、私は勿体ないですがHeightmapを無効化するようにしています。

Heightmap無効化後

MB3_Texture BakerのMaterial Bake Optionsの中にあるTexture Properties To IgnoreでSizeに1を入力してあげて、追加された欄に”_ParallaxMap”と入力してあげると、Heightmapのアトラス化がスキップされます。

これで無くなったHeightmapのテクスチャの分、テクスチャ結合にかかる処理時間は少なくなるのですが、結合結果のマテリアルには1個目のマテリアルのHeightmapが何故か入っているので、消すという動作が必要です。

ここをクリックして、Delキーを押せば消せます

最近になってMeshBakerにはTextureArrayと呼ばれる別の方式が追加されていて、そっちの技法だと自在にタイリングできるはずなので、そちらだと可能かもしれません。

ただし、手順が専用のものになっていて、説明しようとするとそれで記事が一本出来てしまうので割愛します。記事は気が向いたら書きたいと思います。ひとまずTextureArrrayのマニュアルが別にありますので、そちらを紹介しておきます。

・同じメッシュ・マテリアルのオブジェクトは含めずにGPU Instancingを使う

MeshBakerで同じメッシュ・マテリアルのオブジェクトを結合すると、ワールドの容量の肥大化に繋がります。

理由としてはMeshBakerで結合したメッシュデータは別物としてプロジェクト内に保存されるわけですが、結合されたメッシュデータ内に同じメッシュデータがあっても使い回してくれるわけではありません。

これはStatic Batcingの時にした話と同じなので、以下の記事のStatic Batcingの話の部分を呼んでもらえると幸いです。

GPU Instancingを使って、効率よくやりましょう。

・Mesh Baker GrouperとMesh Bakerの項目は共有されている
これも多分初めてMeshBakerを使う人は面食らうと思うので解説しておきます。

Mesh Bakerコンポーネントを初めてみたときに、多分結構な人が感じると思うんですが、

『ここグレーアウトしてるけどどうやって設定するねん』って思った方多いと思います。

一つ上のゲームオブジェクトにあるMB3_Mesh Baker Grouperコンポーネントの方に同じ項目があり、ここが共有化されています。こっちを変更すると、Mesh Bakerコンポーネントの方も追従して変わります。

・結合後のオブジェクトを配置していきたい場合は、Pivot Location Typeを変更する

これはある意味当たり前な感じはあるのですが、結合したオブジェクトをプレハブ化してあちこち置きたいと思う時は、結合したメッシュの中心がPivot(モデルの原点)になってないと操作しづらいですよね?

デフォルトの設定で、うっかり原点から滅茶滅茶遠い位置でベイクしてしまうと、そこの位置で原点を基準としてTransformとRotationが(0, 0, 0)になってしまい、とても扱いづらいです。

PivotからCenterに切り替えれば、問題ないと言えば問題ないのですが、いちいち切り替えるのも面倒なので、MB3_Mesh Baker GrouperコンポーネントのPivot Location Typeを変更してあげましょう。

デフォルトはWorld Origin(ワールド原点)になっていますが、Bounds Centerにすればメッシュ群の中心が原点になります。Custom Lotationにすれば座標を入力してそこをPivotにすることができます。

・近いオブジェクト同士でまとめて結合する
どんな状況でも『1メッシュ1マテリアルにすれば、描画命令が少なくなって軽くなる!』と思っている方が居るかもしれませんが、実はそうではないケースもあります。

Unityではデフォルトで、視界外にあるものは描画しない視錐台カリングと呼ばれる方式が採用されています。

この"視界外"の定義をよく考えてもらえればいいと思うのですが、1メッシュ1マテリアルになるということは1つのオブジェクトになるということです。

つまり結合したオブジェクトは、その一部分が視界に映っているだけで”視界内”の判定になり全てが描画されます。

仮に視界に映っている部分が、そのオブジェクトのたった1%くらいの範囲だったとしても、全て描画されてしまうわけです。描画命令の負荷は少なくなるかもしれませんが、今度は描画自体の負荷が上がってしまうわけです。

つまり、何が何でも『1メッシュ1マテリアル』……を目指すのではなく、適度なエリアで分割しつつ結合するのが大事です。

・テクスチャサイズは2のべき乗にするというお決まり
初心者向けの話ですが、一応書いておきます。

Material Bake Optionsのところにテクスチャのサイズを入力する部分があります。

Max Atlas SizeとMax Tilling Bake Sizeの二つです。前者が結合後に出力されるテクスチャのサイズ。後者が、結合される前のテクスチャが敷き詰められる最大のサイズです。

ここの数値、暗黙の了解で2のべき乗になっていますが、テクスチャサイズは2のべき乗にしていると、テクスチャの圧縮やMipmapの生成など色々な恩恵を受けることができます。ようは計算に都合がいいのです。

2のべき乗以外にすることも可能ですが、内部的には2のべき乗として扱われるので、最初から2のべき乗にしておいたほうが無駄がありません。

・メッシュ結合失敗例の1例

以下のようなエラーが出る時メッシュの結合に失敗しています(2つ目のエラーメッセージにも書いてありますが)

1つ目のエラーをDeepLで和訳してみました。

テクスチャベイクの結果、sourceUVRectマップのマテリアルにマテリアルがありません。マテリアルをベイクしてみてください。メッシュを結合できません。マテリアルを組み合わせずにメッシュを組み合わせようとしている場合は、Texture Bake Resultを削除してみてください。

手順を間違えていないことを確認していますし、マテリアルもあります。
何故だろうと、色々調べていたところCreate Empty Assets For Combined Materialで既存の特定のAssetに上書きしたときに必ず発生することが分かりました。

Assetを新規作成したり、新規作成したAssetに上書きしたりした際には問題ありませんでした。

おそらくAssetの上書き時に何か不都合が起こっていることが予想されるので、ベイクをやり直したい時などは、新規アセットを作るのが無難だと思います。

余談:該当のAssetファイルではマテリアル数や種類が全然違うシチュエーションで結合、上書きを繰り返していました。そこら辺が原因かなと推測しています。同じシチュエーションなら上書きでも問題ないかもしれません。

・(レアケース)メッシュがMissingになる
具体的な状況を思い出せなくて申し訳ないのですが、以前メッシュには出力せずにゲームオブジェクトとしてシーンに出力する形(Bake Into Scene Object)でMeshBakerを使用していたところ、既にベイク済みだったゲームオブジェクトのメッシュ欄がmissingになったことがありました。

メッシュを書き出しておらず、元オブジェクトも消してしまっていたため、泣く泣く再配置→ベイクをやり直す羽目になりました。以降私はメッシュを書き出すようにしています。

ですが、今回検証した範囲内ではそのようなことは起こらず、ベイクした後のメッシュはSceneファイルに保存されていることが確認できました。

ベイク前と後でSceneファイルを比較したところ
メッシュデータが増えていました。

したがって、Sceneファイルに対して何かが起こった結果、メッシュデータが消えてしまったのかなという想像はつくのですが、これはかなりレアケースだと思うので、気にせずメッシュを書き出す必要はないと思います。

Prefabとして扱いたい人や心配性の人だけ、メッシュを書き出すと良いと思われます。

・(おまけ)Unity2022限定の無限プログレス……
Unity2022.3.6f1を使っての今回のMeshBaker検証中に、『プログレスバーが出て無限に終わらなくなる現象』がかなりの頻度で発生しました。Unity2019の時にはなかった現象です。

最長で約2時間ほど放置してみたのですが終わらなかったので、その都度タスクマネージャーでUnityを強制終了しています。

色々条件を探ってみたところ、MeshBakerでのベイク後にPrefab化した『Texture & MeshBakerコンポーネントのついているオブジェクト』に対する何かしらの操作を行おうとするとフリーズするようでした。
(補足:私のワークフローの都合でPrefab化していただけで、メニューから生成する場合は非プレハブですので一般的には問題ありません)

そこで
『Prefab化されたオブジェクト内で、スクリプトによって何かしらステータスの変化が起こった場合(今回の場合はベイク)に、Prefabデータの不整合によってフリーズする』のではないかと思い、Prefab化を解いてからベイクを行ったところ、問題が解消しました。

MeshBaker以外でもスクリプト(あるいはコンポーネント)によってステータスが変わるタイプのものはあると思いますが、もしそういう場合はPrefabを1回解除すると無限プログレスを避けられるかもしれません。

私のMeshBakerのワークフロー


ここからは、上記のような罠などを避けるために私の編み出したワークフローを紹介します。

①(初回のみ)今回使う設定のプレハブオブジェクトを作成
②(初回のみ)アセット保存用フォルダの作成
③結合するオブジェクトの選定・除外・集約
④プレハブオブジェクトを配置
⑤結合を実行
⑥(オプション)やり直し
⑦(オプション)テクスチャ類の軽量化
⑧(ワールド完成後)結合前データの削除

ではそれぞれ説明していこうと思います。

①(初回のみ)今回使う設定のプレハブオブジェクトを作成
制作中のプロジェクトで複数回ベイクを行うようであれば、この工程から開始します。

ようは全ての設定を既にしっかり設定しておいたPrefabのコンポーネントを用意しておく作戦です。

これを作っておくと、設定ミスやかなりの手間を省くことが出来るのでお勧めです。

Unity上部のメニューから[Gameobject]→[Create Other]→[Mesh Baker]にある[Texture and MeshBaker]をクリックすることでゲームオブジェクトが生成されるのでそれをもとに設定していきます。

一例として私が良くやる設定を示しますが、自分のスタイルに合わせて変更してください。説明の下部に画像を貼っているので、それを見つつ説明を読んでみてください。

まずMB3_Texture Bakerコンポーネントの設定ですが、主にMaterial bake Optionのところの項目をいじる感じになります。
Max Atlas Sizeがデフォルト8192は結合するテクスチャの数にもよりますが、基本的にデカすぎるので、2048にしています。
Resize Power-Of-Two Texturesは敷き詰め方が変わって、縦横比維持したまましきつめてくれるのでチェックを入れています。
Max Tilling Bake Sizeは512にしてますが、このパラメータは私の検証した範囲内では全く機能していません。敷き詰められる最大のサイズで敷き詰められます(MaxではなくMinなのかもしれませんが、詳細は不明)
そして、Consider Mesh UVs(0~1の外にあるUVの考慮)とBlend Non-Texture Propertiesにチェックを入れています。
また、Heightテクスチャを除外するためにTexture Properties To Ignoreにプロパティ名を入力しています。

次にMB3_Mesh Baker Grouperコンポーネントの設定です。
ライトベイクの設定と、結合モデルの中心位置の設定を弄っています。

最後にMB3_Mesh Bakerコンポーネントの設定です。
ポリゴン数上限を避けるためにPrefabでのメッシュの書き出しと、書き出し時にゲームオブジェクトを作成するように"Leave Instance In Scene After Bake"にチェックを入れています。

設定が終了したら名前を分かりやすく改名して、ゲームオブジェクトをHierarchyからProjectタブにドラッグ&ドロップしてPrefab化して、分かりやすいところに置いておきます。

想定される全てのパターンを作っておけば、Unityパッケージとしてエクスポートしておくことで次回以降のプロジェクトではインポートするだけでよくなるのでスムーズです。

②(初回のみ)アセット保存用フォルダの作成
MeshBakerでは保存場所を求められる場所が何か所かあります。
そこで初回の作業でフォルダを作っておくことで、一か所に関係ファイルを集約します。

保存場所を求められる時、基本的にエクスプローラーの機能で保存場所を選択します。そのためフォルダ名の先頭に記号を入れておくと、上部に表示されるようになります。

これにより1番上に来るようにしておけば、選択するときに何も考えずに1番上を選択できるようになり楽になります。私は「_BakeData」のように先頭にアンダーバーを入れて名前を作っています。

記号と言われて「~」(チルダ)を使うと、Unityの仕様でファイルの存在が無視されてしまうので、アンダーバー辺りが無難だと思います。

結合したオブジェクトのPrefabを利用する場合は、自分の管理しやすいようにマテリアルやテクスチャの保存場所とは分けてフォルダを作っておくと便利だと思います。

こちらもフォルダだけ①のPrefabと合わせてUnityパッケージ化しておくと、捗ります。

③結合するオブジェクトの選定・除外・集約

結合するオブジェクトとそうでないものに分けて、結合するオブジェクトは適当なゲームオブジェクトに集約しておきます。

集約するゲームオブジェクト名は分かりやすいものに改名しておきましょう。改名については、名前を3回クリックで編集しても良いですが、私は選択した状態でF2ボタンを押す方法をよく使います。

結合しないオブジェクトとしては、
・ピックアップやギミック類
・同じメッシュ・マテリアルを持つオブジェクトで大量にあるもの
などは避けましょう。後者はGPU Instancingで軽量化しましょう。

また、オブジェクトをまとめる際に気を付けるべきポイントは以下の通りです。
・シェーダーのプロパティの値(メタリック、透明度、マテリアルカラー、その他いろいろ)が異なっているマテリアルは別にする。
・ライトベイクするものとしないもので別にまとめる。
・なるべく距離が近い物のみを結合する(離れているものは別途結合する。ポツンと1個だけある場合は結合しない)

④プレハブオブジェクトの配置

手順①で用意したプレハブオブジェクトを置き、Prefab化を解除します(2022だと以下の場所にUnpack Completelyがあります)

この時名前を変えておくと良いでしょう。名前を変えても問題なく機能しますし、この時の命名を先ほど決めた集約用のゲームオブジェクトと一致させておくと管理しやすくなります。

このプレハブオブジェクトはワールドが完成するまでは取っておく想定なので、しっかり管理しておきましょう。

⑤結合の実施

あらかじめ設定済みのPrefabを用意したことによって、5つの手順で結合できます。
1, 集約オブジェクトをドラッグアンドドロップ
2, Create Empty Assets For Combined Materialを押下
3, Bake Materials Into Combined Materialを押下
4, Create Empty Prefabを押下
5, Bakeボタンを押下

4について少しだけ補足します。デフォルトがMyPrefabという名前になっていますが、すでにMyPrefabを1度保存したフォルダに保存しようとすると、ナンバリングが勝手にずらされて別のファイルとして保存されます。この性質を利用して、特に何も考えずに一つのフォルダに保存していくことができます。
(几帳面な人は名前をきちっと変えて管理するのでしょうが、判別できなくなるほど無数に結合するケースはレアだと思うので恐らく必要ないでしょう)

生成されたゲームオブジェクトの名前を管理しやすいように変えます。集約用のゲームオブジェクト名の名前を先ほど決めたと思いますが、自分はその頭に”Bake_”と付ける形で命名しています。その後、先ほど作った集約用ゲームオブジェクトと並べておくことで分かりやすくします。

その後Bakeボタンの下にあるDisable Render On Source Objectsボタンを押して、結合前メッシュ達のMeshRendererやSkined Mesh Rendererを無効化して、一通りの手順が終わります。

このBakeの下のボタンはトグルでEnableとDisableが切り替わります。
Enableが有効化、Disableが無効化です。

そして、大事なことなので強調しますが、Texture & Mesh Bakerコンポーネントのついたオブジェクトは不必要になるまで絶対消さないでください!

ベイクに失敗したなーって思った時に、Bakeボタンの下のEnable Render On Source Objectsからもとに戻せるようにしておくためです。

消してしまうとやり直したい時に、結合前のオブジェクトのRendererをオンにしていく作業を自前でやる羽目になります。

当然ながら、結合前のオブジェクト群も同様です。

やり直し出来るようにというのもありますが、コライダー等のコンポーネントはその結合前のオブジェクトにくっついているものが機能していますので、迂闊に消すとそれらの機能が無くなってしまいます。

⑥(オプション)やり直し

やり直しする場合はどこからやり直すかによりますが、混ぜてはいけないマテリアルを混ぜてしまった場合など、テクスチャ生成からやり直すようでしたら最初からやり直してしまったほうが良いと思います。

その場合、同名でアセットファイルを作ると上書きされるので、データを別途削除する必要はないですが、上で紹介した通りエラーが出るケースもありそうなので、エラーが出る場合は新規アセットファイルを作成するのが安全そうです。

マテリアルのベイクオプションの変更でしたら、途中からやっても問題ないと思います。

⑦(オプション)テクスチャ類の軽量化
テクスチャ類が入っているフォルダを開いた状態で、右上のTypeアイコンからTextureを選択します。

するとテクスチャだけが表示されますが、デフォルトだと検索範囲がIn Assetsになっているので、現在のフォルダ名が表示されてるところをクリックします。

これで現在のフォルダのテクスチャだけが表示されている状態になるので、1個選択してCtrl+Aなどでまとめて選択した状態で、設定を変えられます。

これはテクスチャに限らず色々なもので使えるので、あえて紹介しましたがプロジェクト内のテクスチャをまとめて軽量化するなら以下の記事で説明した、VRCWorld Toolkitや一括圧縮ツールAssetCompresserなどを使ったほうが良いと思います。

⑧(ワールド完成後)結合前データの削除

結合後データにメッシュコライダーコンポーネントを付けることで、コライダーが機能します。その場合、結合前の集約したオブジェクトが要らなくなると思いますので、削除します。

MB3_Texture BakerとMB3_Mesh Bakerのコンポーネントが付いたオブジェクトも必要なければ消しましょう。

削除するのが怖い場合は、別のシーンを作ってそこに移動しておくというのが良いと思います。位置関係が維持されるので、元のシーンに戻すだけで復元できます。シーンって何?って方には以下をオススメしておきます。

おわりに

いかがだったでしょうか?

ここで説明した通り、MeshBakerは使用するにあたり、かなりの繊細さが必要になってくるツールであり、私個人としては絶対に初心者に勧めるツールではないなと思っています。

しかしながら、この複雑さは多機能であることの裏返しでもあると思っています。

実際、他の類似ツールを触った時に、
『この機能が無いのがつらいな~』
って思ってしまって、結局MeshBakerに戻ってくるというのを繰り返しています。

そこで、厳密なルールを持って運用することで、手戻りを防ごうと思って編み出したのが私のワークフローです。

お察しの通り、無数の私の屍によってできた情報なので、無償で公開するのはモヤモヤするのですが、有償だと読んでほしい人に届かないだろうなと思い、無償にしました。

ただモヤモヤしたままはよろしくないので、内容が全くない有料部分を作りました。ようは投げ銭的なスタイルです。余裕がある方はしてもらえると私の心が救われます。
(余談:本来はサポートボタンがそれに相当する機能だと思うのですが、何か分かりづらいですよね?私も一度サポート頂くまで、そんな機能があるなんて気がついていませんでした)

あとはハートマークのクリック(もちろん無料)でも喜びます!なんとNoteにユーザー登録してなくてもハートマークは押せるんですよね~。
私の記事じゃなくてもいいんで、いいなと思った記事には是非気軽に押してってあげてください。

『いつものワールド製作者向け記事は無償なのに?』
って思うかもしれませんが、いつもの記事の内容は真摯に勉強する気概さえあれば、いずれ手に入る基礎的な知識だと思っていますので、無償にしています。

基礎的な部分は以前同様、無償で記事を書こうと思っているので安心してください。

この記事が役に立ってくれることを願いつつ、文章を締めさせていただきます。

長文読了、お疲れ様でした。

サムネイルのワールド:Underwater by suzuki_i


ここから先は

24字

¥ 300

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