LoginSignup
2
2

More than 1 year has passed since last update.

【Unity】MeshをAssetBundleビルドすると付加情報が削られてしまう件

Posted at

事象

Unityで 頂点アルファが付加されたMeshをAssetBundlleビルドしてロードすると頂点アルファが消えている ,という現象が起こることがあります.

image.png

原因

PlayerSettingsの Optimize Mesh Data オプションがtrueになっているのが原因でした.

image.png

https://answer.uwa4d.com/question/5985785a46dafb521451bd85
上記のページによると, Optimize Mesh Data は以下のような挙動をします.

一般的には、「メッシュデータの最適化」オプションをオンにすることで、エンジンは発行時にすべてのメッシュデータを繰り返し処理して、余分なデータを削除し、データサイズを小さくすることができます。 なお、「冗長な」データとは、レンダリングのためのShaderでは必要のないデータがメッシュデータに含まれていることを意味します。つまり、メッシュデータに位置、uv、法線、色、接線などの頂点データが含まれているが、そのデータが メッシュデータに位置、uv、法線、カラー、タンジェントなどの頂点データが含まれていて、レンダリングに使用するシェーダーには位置、uv、法線しか必要ない場合、メッシュデータのカラーとタンジェントは「冗長」であり、ゲーム公開時にエンジンによって自動的に削除されます。
このオプションをオンにすることは、両刃の剣であることに注意する必要があります。 開発チームは、ランタイムの状況でのシェーダーの変更に特に注意を払うことをお勧めします。 より多くの頂点プロパティへのアクセスを必要とする複雑なシェーダをランタイム中に特定のGameObjectに置き換える必要がある場合は、ランタイムで使用されるメッシュデータをエンジンが削除しないように、これらのシェーダを適切なPrefabにマウントしてからリリースすることをお勧めします

つまり,UnityはこのオプションがONの状態でAssetBundleをビルドするとPrefabで使用されているMesh, Material(Shader)を静的解析し使用していない付加情報をStrippingする,ということだと思われます.

解決

1つのAssetBundleの中に頂点情報を使用するMaterialをアタッチしたPrefabを含むようにして解決しました.

改善前
image.png

改善後
image.png

これによりPrefabで使用しているMesh, Shaderが解析され,Shaderで使用している頂点情報がビルド時に残ります.
ただし,こちらの場合でも Prefabに付けたShaderで使用していない頂点情報はStrippingされてしまう ので注意してください.

ランタイムでShaderを切り替えてそれぞれ別の頂点情報を使用する,といった用途だとかなり不便ではあるので必要に応じて Optimize Mesh Data は無効にするのもアリかと思います.
(というか,トラブルのもとになるかと思うので特に必要なければ無効にしておくのが良いのではないかと思います)

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2