ビログ

HTML5ブラウザゲーム作ったりVRで遊んだりしたことを書きます

VRChatを重くせずに大量のオブジェクトを持ち込む(MeshBaker解説)

f:id:bironist:20190317193312p:plain

VRChatに大量のオブジェクトを持ち込んでも重くしないためにMeshBakerを使おう!

 はじめに

バーチャルマーケット2、すごかったですねえ。
400以上のブースが集まりクリエイターたちが各々の世界観でブースを作成し作品を展示・販売する。バーチャルマーケット2を巡っている最中は感動しっぱなしテンション上がりっぱなし、本当に自分がVRに興味があってよかった、VRChatやっててよかったと思いましたね。

さて、そんなエモすぎたバーチャルマーケット2、何を買いましたか?パズルラリーとかもあって、大量の3Dモデルをゲットしたことかと思います。でもそのままHDの肥やしになってしまってる人多いんじゃないですか?せっかく買ったのだから、アバターに装備してVR空間でみんなと見て、語ろうじゃないですか!

かごに入れていっぱい持ち込んでしまおう

でもいっぱいのアイテムをどう装備したものか困ってしまったぼくは、おにぎり配布アバターを作ったとき背中に背負っていたかごに入れて持ち込もうと思い立ちました。

これならたくさんのオブジェクトを一気にVRChatに持ち込んでみんなと見ることができる!
はい、というわけでいつものブログ記事のようにアイテムの宣伝です。

f:id:bironist:20190316191413p:plain
https://bironist.booth.pm/items/1277093

おにぎりのとき背負っていたものをブラッシュアップし、シェイプキー(Unity上の表記だとBlendShape)でベルトの幅と太さを調整可能にしたものです。

メッシュ、マテリアル数が多すぎる

しかしそのままカゴに大量のアイテムをつっこんでVRChatに持っていったら、大量のマテリアルとMesh Renderer(Skinned Mesh Renderer)によりパフォーマンスランクはVery Poorまっしぐら!描画負荷が高く重いアバターになってしまいます。
そこで活躍するのがMeshBakerというUnityアセット!

このアセットはUnity上でマウスをポチポチッとするだけで複数のメッシュを統合し1つに、更にテクスチャもアトラス化して1枚に、そしてマテリアルも1つにしてくれちゃうスグレモノです。つまり、そのままVRChatのパフォーマンスランクに影響するメッシュの数、マテリアルの数の問題を完璧にクリアしてくれます。そして今のVRChatは7万ポリゴンまで使用可能で、7万ギリギリまで使ってもパフォーマンスランクはGoodを維持できます。
Mesh Bakerにはフリー版もあります。

Free版と有料版の違いは下記の通り。

  • 有料版はポリゴン数制限がない、無料版は65000ポリゴンまで
  • 有料版はシェーダーに制限がない、無料版はDiffuseとBumped(レガシーシェーダー)しか使えない
  • 有料版は統合したメッシュをPrefabに出力する機能(統合したメッシュをファイルとして出力する機能)がある、無料版はシーンに直接出力するしかない。

VRChatのアバターに使う上は無料版で十分だと思っていました。もともと7万ポリゴン制限があるのでポリゴン数制限が問題にならない、シェーダー制限は一時的にDiffuseに切り替えてマテリアル統合後戻せばいい、他の人に渡す必要がないならPrefabにする必要がない。しかし試したところ、最後のシーン出力機能しかないのが問題なようで、統合したメッシュがUnity上では確認できるものの、アップロードすると消えてしまいました。
VRChatアバター以外で普通にビルドして使う分には大丈夫なのでしょうが、VRChatアバターで使う上ではこのPrefab化の機能が必須のようでした。
なお、VRChatのワールドとしてアップロードする場合はMesh Baker Freeでも正常にアップロード・表示されました。ワールドで利用する場合はFree版でも大丈夫です。(ただし自分で直接アップロードする場合のみ、バーチャルマーケットのようなイベントにunitypackageで提出する場合は、やはりPrefab化機能が必須です)

また類似の機能をもつ無料のアセットにSimplest Mesh Bakerというのもありますが、これも試した結果アバターとしてアップロードすると表示されませんでした。というわけで、どうやらアバターに使う場合は有料版MeshBakerを使うしか無いようです。もしFree版やSimplest Mesh Bakerでもなんとかする方法があるなら教えてください!

というわけで、このあとでは有料版Mesh Bakerの使用を前提として解説します。

 Mesh Bakerの使い方

前振りが長くなってしまいましたがここからが本題Mesh Bakerの使い方です。とりあえずMesh Balerと背負いかごをImportしましょう。

かごの中にオブジェクトを詰め込む

かごをHierarchyに入れて、Create EmptyしてオブジェクトをまとめるItemという空のGameObjectを作ります。
f:id:bironist:20190317160816p:plain
作ったItemの中に、アバターに装備したいオブジェクトをどんどん詰め込みます。
f:id:bironist:20190317161053p:plain
位置や大きさを調整してそれっぽく見えるように調整します。このへんまではいつもどおりですよね。アバターを合計したとき7万ポリゴンを超えない程度まで詰め込みましょう。
f:id:bironist:20190317161352p:plain
できました。これをこのままVRChatに持ち込んだら一発でVery Poorですね。

Mesh BakerをHierarchyに追加する

メニューからGame Object>Create Other>Mesh Baker>TextureBaker and Mesh Bakerと選択します。
f:id:bironist:20190317161920p:plain
するとHierarchyにTextureBaker(0)と、その配下にMeshBakerが追加されます。
f:id:bironist:20190317162115p:plain

TextureBakerでテクスチャ・マテリアルを統合する

TextureBakerをクリックしてInspectorを開き、Open Tools For Adding Objectsをクリックします。
f:id:bironist:20190317162645p:plain
ウィンドウが開くので、HierarchyのItemを選択して、Search For Meshes To Addタブをクリック、Exvlude meshes with out-of-bounds UVsのチェックを外し、Add Selected Meshes To Targetをクリックします。

f:id:bironist:20190317163036p:plainその後ウィンドウを閉じます。InspectorのObject To Be Combinedを開くと(デフォでは閉じてるので注意!)統合対象のオブジェクトが一覧表示されます。

f:id:bironist:20190317163355p:plain
ここでもし取りこぼしているオブジェクトがあったら、手動で追加しておきましょう。すべて追加されていたら、Create Empty Assets For Combined Materialをクリックします。

f:id:bironist:20190317163521p:plain
するとファイルの保存ダイアログが表示されるので、適当にわかりやすいフォルダを作り、ファイル名を付けましょう。とりあえずBakedItemフォルダを作り、その中にBakedItemファイルを作りました。

f:id:bironist:20190317163902p:plain
そしてBake Materials Into Combined Materialをクリックします。

f:id:bironist:20190317164034p:plain
するとテクスチャのアトラス化、マテリアルの統合が自動で進みます。オブジェクトの数次第でそこそこ時間がかかるのでしばしまちましょう。
処理が終わったら、さきほど作ったBakedItemの中にアトラス化されたテクスチャが保存されているので確認してみましょう。

f:id:bironist:20190317164319p:plain
そのまま持っていくとバラバラに読み込むはずだった大量のテクスチャが1枚の4Kテクスチャにまとめられていることが確認できます。これは軽くなりそうですね!

統合したメッシュを保存するためのPrefabを作成する

続いてメッシュの統合をするのですが、その前に前述の通りVRChatアバターにはPrefabとして出力したメッシュしかもっていけないので、統合したメッシュを保存するためのPrefabを作ります。HierarchyにCreateEmptyで空のGameObjectを作り、それにBakedItemという名前を付けます。最初にItemというGameObjectを作ったのと同じ感じです。

その後Projectウィンドウで先程マテリアルを統合したフォルダ、BakedItemを開いて、その中でCreate>Prefabを選択してBakedItemという名前のPrefabを新規作成しましょう。

f:id:bironist:20190317165013p:plain
完成した空のPrefabにHierarchyのBakedItemをD&Dします。

f:id:bironist:20190317165305p:plain
これで統合したメッシュを保存するためのPrefabができました。

MeshBakerでメッシュを統合する

HierarchyからMeshBakerをクリックしてInspectorを開きます。そしてOutputをBake Into Prefabに設定し、Combined Mesh Prefabで先程つくったPrefabを指定し、Bakeボタンをクリックします。

f:id:bironist:20190317165649p:plain
これで完成です。HierarchyにあるBakedItemオブジェクトの中に統合したメッシュのオブジェクトが追加されています。MeshBakerのお仕事はこれで終わりです。HierarchyのTextrueBaker(0)などは削除してしまっても構いませんが、あとで修正するためにもとっておいたほうがいいかと思います。また、統合前のオブジェクトが詰まっているItemオブジェクトも必要ないので、Inspectorからチェックを外して非表示にしておきましょう。

あとは統合メッシュをいつもどおりアバターに装備させるだけですね!

統合メッシュをアバターに装備させる

ここから先は普段どおりのアバターカスタマイズなので、わかってる方は読み飛ばしちゃってかまいません。

かごの中に統合したメッシュを入れる

BakedItemオブジェクトを、SeoiKagoの配下に移動します。

f:id:bironist:20190317170506p:plain

そしてSeoiKagoを装備したいアバターの背中に位置・サイズを合わせて、Chestボーンの配下に移動します。

f:id:bironist:20190317171253p:plain
その際、SeoiKago配下のBeltオブジェクトのInspectorを開いてBlendShapesを開き、BeltWidthとBeltSizeの値を変更することでアバターの肩にベルトをジャストフィットさせることができます!Blenderで調整などしないでもフィットできる機構が装備させてるなんて便利ですね!
f:id:bironist:20190318124843g:plain

完成

完成です。おつかれさまでした。