Unityでシーンの容量を削減する方法 (モデル編)

本記事は、シーン容量削減シリーズモデル編になります。

他記事は下記のリンクから確認できます。

シーン容量削減シリーズ

Project Settingsの確認

まずは、 Project Settings にある Vertex Compression を見てみましょう。

Vertex Compression

Vertex Compression

Vertex Compression

Project Settings > Player > Other Settings > Optimization の中に Vertex Compression という項目があります。

これは頂点情報の圧縮に関する設定で、プロジェクト内の すべてのメッシュ に影響します。(あくまでビルド時に利用するものであり、元のメッシュファイルに影響はありません)

こちらは頂点の数を減らすものではなく、位置やUVといった頂点1つ1つが持つデータの精度(座標値の桁数)を減らすものです。

以下の項目があり、 チェックをつけた項目は、容量を半分に削減できますが、精度も落ちます。

項目名 初期値 内容
None 🔲 何も圧縮しません。
Everything 🔲 以下のすべてを圧縮します。
Position 🔲 位置。圧縮すると外見に大きな影響を与える可能性があります。
Normal 法線
Tangent 接線
Color 🔲 カラー(テクスチャではなく頂点カラーのこと)
Tex Coord 0 メインのUV。一般にカラーテクスチャーやノーマルマップに使われます。
Tex Coord 1 🔲 サブのUV。いわゆるUV2。一般にライトマップに使われます。
Tex Coord 2, 3 予備のUV
 
チェックをつけた項目は、精度が FP32 から FP16 になります。

容量を半分に削減できますが、精度も若干悪くなるので、 見栄えとパフォーマンスのトレードオフ になります。

FP32とFP16の違い

FP32 と FP16 はどちらも、コンピューターが実数(浮動小数)を表現するためのデータ形式です。

以下のような違いがあります。

データ形式 容量 表現可能な範囲
FP32 32bit 1.4 x 10^{-45} ~ 3.4 x 10^{38}
FP16 16bit 5.96 x 10^{-8} ~ 65504

スキンメッシュには、 Vertex Compression は効かないので、ご注意ください。

スキンメッシュとは、ボーンを動かすと連動して変形するメッシュのことで、たとえばアバターが当てはまります。

モデルの設定を見直す

次に、モデル毎の設定を見直します。

FBX等のモデルファイルを選択すると、 Inspector ウィンドウに以下のような設定項目が表示されます。

Inspector

Inspector

これらの設定項目はあくまでビルド時に利用するものであり、変更しても元のモデルファイルに影響はありません。

今回はこの中で、容量削減に効果がありそうな項目を紹介します。

Import BlendShapes

Import BlendShapes

Import BlendShapes

Import BlendShapes は、ブレンドシェイプをインポートするかどうかの設定です。

ブレンドシェイプを使わないモデルは、 OFF にすることで容量を削減することができます。

 

  • ブレンドシェイプとは

ブレンドシェイプとは、メッシュの頂点を動かしてアニメーションさせる技術です。

キャラクターの表情や口の制御によく使われます。

以下の図は、ブレンドシェイプで口の形が変化している様子です。

左から a i u e o のブレンドシェイプを適用しています。

ブレンドシェイプ

ブレンドシェイプ

Mesh Compression

Mesh Compression

Mesh Compression

Mesh Compression は、メッシュ毎に圧縮レベルを決めるための設定です。

プロジェクト全体の共通設定である Vertex Compression よりも、メッシュ毎の個別設定である Mesh Compression の方が、優先されます。

以下の選択肢があります。

容量 品質 位置の
圧縮率
法線の
圧縮率
接線の
圧縮率
UVの
圧縮率

カラーの
圧縮率

Off 最大 最高 1.0 1.0 1.0 1.0 1.0
Low 1.6 4.6 4.4 2.0 1.0
Medium 2.9 5.6 5.3 3.2 1.3
High 3.2 7.4 6.7 4.0 2.0
 
 
なお、 Mesh CompressionはVertex Compressionと同じく、頂点の数を減らすものではなく、位置やUVといった頂点1つ1つが持つデータの精度(座標値の桁数)を減らすものです。
 
  • None
無圧縮

無圧縮

  • Medium
容量は None の約40%

容量は None の約40%

  • High
容量は None の約30%

容量は None の約30%

図転載: Reducing build sizes in Unity3D

上図のように、 High に行くほど容量を削減できますが、品質も低下してしまうので、 見栄えとパフォーマンスのトレードオフ になります。

Legacy Blend Shape Normals

Legacy Blend Shape Normals

Legacy Blend Shape Normals

Legacy Blend Shape Normals は、ブレンドシェイプの法線に関する設定です。

ONにすると古い法線の計算方法が適応され、OFFにすると新しい方法(Blend Shape Normals)が適応されます。

Legacyという名前通り、古い方法を有効にするための設定項目なので、強いこだわりがなければ OFFにした方がいいです。

その代わりに、次項で説明する Blend Shape Normals を適切に設定しましょう。

Blend Shape Normals

Blend Shape Normals

Blend Shape Normals

Blend Shape Normals は、ブレンドシェイプの法線に関する設定です。

Legacy Blend Shape Normals を OFF にすると、設定できるようになります。

容量 機能
Import モデルが保有しているブレンドシェイプ毎の法線を使用します。
モデリングソフトで作成した法線をそのまま使いたい場合に選択します。
Calculate Unityがブレンドシェイプ毎に法線を自動で計算します。
具体的には、 Normals Mode Smoothness Source Smoothing Angle の値にしたがって計算します。
Legacy Blend Shape Normals よりも洗練されたアルゴリズムらしいです。
None ブレンドシェイプ毎の法線を使用しません。
すべてのブレンドシェイプで共通の法線を利用します。

ブレンドシェイプを使わないモデルは、 None を選んで容量を削減しましょう。

すべてのブレンドシェイプで共通の法線を利用しても問題ないと判断した場合も、 None を選ぶと容量を削減できます。

Unity以外でやれること

ここまでUnityの設定項目を紹介してきましたが、どうしても大味な対処になりやすく、限界があります。

Blender等のモデリングツールが使えるのであれば、以下のような手法により容量削減ができるかもしれません。

不要なデータを削除する

ストア等で販売されているアセットは、さまざまな用途でも利用できるように、多くのデータを含んでいます。以下のようなものです。

 

  • メッシュ
  • 法線
  • 接線
  • UV
  • 頂点カラー
  • ボーン
  • スキンウェイト
  • ブレンドシェイプ

ご自身が作っているUnityシーンに、上記すべてのデータが必要かというとそうではないことが多いです。

不必要なデータは、Unityに取り込む前に削除しておく ことで、容量を削減できます。

頂点数を削減する

ここまで触れてきませんでしたが、容量削減効果が非常に高い方法として、 頂点数削減 があります。

頂点数が必要以上に多いメッシュは、頂点数を削減することを推奨します。

ただ、外観が崩れてしまうリスクが高いため、繊細な配慮と高度な知識を必要としますので削減前のモデルのバックアップなどを取っておきましょう。

デシメートモディファイアー

デシメートモディファイアー

図転載 【Blender3.1】面/頂点を削減:デシメートモディファイアー

これでシーン容量削減シリーズ(モデル編)は終了です。

同シリーズの他記事は下記のリンクから確認できます。

Special thanks:segur(せぎゅ)