VRChat ワールドをOculusQuest対応するためにしたこと

こんにちは!Klueleです。
最近はワールドをOculusQuest対応するために少しずつ軽量化したりしていました。この記事では、Quest対応するために変更したことなどをまとめていきます。(画像は今後追加予定です。)

■ 目次 ■
1.PC版のワールドをPrefab化してExportする
2.別プロジェクトにVRCSDK導入、レイヤ設定、プロジェクト設定をする
3.ExportしたワールドをImportする
4.UploadPlatformCheckerを導入してプラットフォームをAndroidにする
5.ワールドのサイズを確認する
6.不要なコンポーネントを削除する
7.テクスチャを圧縮する
8.BGMを圧縮する
9.メッシュを圧縮する
10.ライティングの設定を見直す
11.ワールドの広さを見直す
12.マテリアルの共通化、シェーダーの変更
13.メッシュの分割を変える
14.メッシュの頂点数を減らす
15.パーティクルのCollision設定の変更

1.PC版のワールドをPrefab化してExportする
1つのプロジェクトでPC版とQuest版を同時に管理するのは大変です。Quest版は思い切って別プロジェクトにしてしまいます。そのため、PC版のワールド全体を1つのPrefabにしてExportします。

画像1

(シーン配下を1つのPrefabにした図)

画像2

(PrefabをExportする図)

2.別プロジェクトにVRCSDK導入、レイヤ設定、プロジェクト設定をする
ワールド作成するときと同じ手順で新しくプロジェクトを作成します。独自にレイヤーを作っていた場合は同じ構成で作り直します。

3.ExportしたワールドをImportする
Exportした.unityprojectファイルをインポートします。Unity Asset Storeのアセットが不完全で動作しない場合は、Asset Storeからインポートし直します。
ここまでの1~3までの内容でうまくいかない場合は、マイドキュメントに格納されているプロジェクト用フォルダをコピーして、違う名前に変えると別のプロジェクトとして使えるので簡単です。

4.UploadPlatformCheckerを導入してプラットフォームをAndroidにする
がとーしょこらさんが素晴らしいツールを作成されています。
「UploadPlatformChacker」をダウンロードしてインポートします。https://gatosyocora.booth.pm/items/1313067

READMEファイルに書かれている通り、Android SDKがインストールされていない場合はインストールします。

画像3

Androidボタンをクリックして、プラットフォームを変更します。いろいろ変換されるのに時間がかかります。

5.ワールドのサイズを確認する

一度ワールドをビルドした後、ConsoleのUnityエディタログを開いてCompressed Sizeを確認します。Quest対応するには50MB以下である必要があります。
また、サイズが大きい順にファイル名が書かれているので、サイズ軽量化のときには上から着手すると効率がよいです。

画像4

画像5

ワールド最適化|VRChat 技術メモ
https://vrcworld.wiki.fc2.com/wiki/%E3%83%AF%E3%83%BC%E3%83%AB%E3%83%89%E6%9C%80%E9%81%A9%E5%8C%96

6.不要なコンポーネントを削除する
ワールドのサイズを小さくするときにまずチェックしたいのは、不要なコンポーネントが削除できないか、ということです。とりあえず無効にしてあるけど有効にすることがないコンポーネントは削除していきます。
テスト用にカメラを複数配置している場合、Target Displayが選択できず意味がなくなってしまうので、余分なカメラは削除します。

画像6

(AndroidプラットフォームではカメラにTarget Displayの項目がありません)

7.テクスチャを圧縮する
ワールドのサイズで多くを占めるのがテクスチャです。Crunch Compressionを適用したり、遠くのオブジェクトにしか使わないテクスチャはMax Sizeを小さく変更したり(大きくても512まで)、MipMapを作成しなくしてサイズを小さくします。
また、Scaleを変えていないオブジェクトに使っているテクスチャはRead/Writeを外すとメモリ使用量を減らす効果があります。

画像7

さらに容量削減に時間がかけられる場合は、メニューのFile>Build SettingsからAndroidのTexture Compressionの選択肢を「ASTC」に変更します。
(このままの状態でBuildすると容量が増えてしまうので注意!)

画像17

テクスチャの圧縮Formatを「RGBA Compressed ASTC 12x12 block」(または「RGB Compressed ASTC 12x12 block」)、Compressor Qualityを「Best」にするとさらに4割程度に削減できます。細かな色の表現はできなくなりますが、比較的少ない影響で容量削減できるので試してみる価値はあると思います。

画像18

8.BGMを圧縮する

ステレオである必要がなければモノラルにします。
Vorbis形式にした上で、音質を考慮しながらQualityの値を下げていきます。
また、タイミングが重要でなければStreamingでロードするように設定します。(ロード方法はファイルサイズよりメモリ使用量に影響する設定です)

画像8

9.メッシュを圧縮する
Mesh CompressionをLowにします。Highにしてもそれほどデータサイズは小さくなりません。なお、データサイズは小さくなりますがレンダリング(主にGPU)のパフォーマンスは改善できないようです。

画像9

10.ライティングの設定を見直す
Oculus Quest使用時にはデフォルトだと20mの範囲しか影は落ちない設定になっています。影がカリングされるのがかなり目立ってしまうので、特に重要でない場所以外は影を落とさないようにします。

画像10

Shadow TypeはほぼNo Shadowsにします。また、Soft ShadowsはQuality Settingsにより無効にされているので影はHard Shadowsにします。

また、Lightmap Resolutionは5以下にしてライトマップを1枚に抑えておくとサイズの面でも、CPU負荷の面でも好ましい結果になります。

画像11

Lightmap ParametersはVeryLowなのでLightmap Resolutionは実質0.5相当です。

11.ワールドの広さを見直す
PC版ではカメラのClipping Planeは200m程度にしていましたが、Quest版では80~120m程度にします。背景用の地面や周辺の建物用にオブジェクトを配置している場合は、近くに小さく配置するなどの見直しをしてもよいかも知れません。背景用オブジェクトが小さくなれば、メッシュを結合するなどデータ削減の余地ができます。

画像12

画像13

ワールドの広さの比較。上がQuest版、下がPC版です。Quest版は約200m×200m、PC版は約250m×230m。

12.マテリアルの共通化、シェーダーの変更

似ているマテリアルは使いまわして、マテリアル数を削減します。
また、VRChat/Mobile以下のシェーダーを優先して使用し、GPU負荷を下げるようにします。私はとりあえず以下のシェーダーを使っています。
(UnlitやStandardシェーダーを使うと警告が出ますが、アップロードはできます)
VRChat/Mobile/Diffuse
VRChat/Mobile/Dumped Diffuse
VRChat/Mobile/Standard Lite
VRChat/Mobile/Particles/Additive
VRChat/Mobile/Particles/Multiply
Unlit/Texture
Standard (Transparent, Cutoout, Fadeが必要な場合)

13.メッシュの分割を変える
PC版の場合は、static batchingできないオブジェクトはとりあえずメッシュ統合すれば良かったのですが、Quest版は少し事情が違うようです。
Quest版では描画される頂点数の目安が(アバターを含めずに)5万程度と言われています。メッシュを統合しすぎると1オブジェクトだけで5万近くになることもあり、ある方向だけ突然極端にfpsが下がることがあります。
メッシュを統合する場合は1オブジェクトで10,000頂点程度に抑えておき、fpsが下がる場合でも滑らかに、fpsが低い範囲は小さくすることが重要です。また、カリングやトリガーを使って不要なレンダリングをoffにします。

画像14

water pool parkでの分割例。ウォータースライダーは曲線が多く、頂点数も増えてしまいます。分割する単位は視野の動きを考慮し、水平方向に分割するようにします。

14.メッシュの頂点数を減らす
モデリングができない人でもアセットを使用すればポリゴンを減らすことができます。見た目が変わるのと、有料アセットを使うこともあって、優先して行う内容ではないかもしれません。

使ったアセットは「Mesh Simplifier」です。
https://assetstore.unity.com/packages/tools/modeling/mesh-simplify-43658

Mesh Simplify コンポーネントをアタッチして、削減する割合をVertex %スライドバー指定し、Compute meshでうまくできたらEnable Prefab Usageにチェックを入れて保存します。

画像15

保存した後はMesh Simplifyコンポーネントを削除できます。簡単にポリゴンを減らせて使いやすいです。

15.パーティクルのCollision設定の変更
water pool parkでは最大で約400パーティクル/秒のパーティクルが生成されていますが、その全てでCollision指定があり無視できない負荷になっていました。
CollisionはTypeが3DよりもPlanesのほうが負荷が少なくなるので専用のPlaneオブジェクトを準備してこのPlaneとだけCollision判定が行われるようにしました。

画像16

ここまでで、私がOculusQuest対応するために取り組んだことを列挙してみました。water pool parkではワールドのサイズを100MB→40MBに削減するとともに、ドローコールは600→100程度に下げています。まだ負荷の削減には不十分な状態なので、サイズ削減だけではなくCPU/GPU負荷低減にも取り組んでいきます。それでは、楽しいVRChatライフを!

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