🗂

UnityでMToonまたはlilToonがビルド時にシェーダーがストリッピングされる問題とその解決策

2025/01/19に公開

はじめに

デスクトップマスコットの OSSとして以下のプロジェクトを開発しています。こちらのプロジェクトではVRM(MToon)およびlilToonを使ってキャラクターの見た目の表現を担保しています。

https://github.com/MidraLab/uDesktopMascot

こちらのプロジェクトでは、StreamingAssetsにVRMを置くことで任意のVRMをロードできるようにしています。

今回は、開発をする中でビルド時のみでshaderがロードできずに外部VRMがロードできない問題にあたってしまったため、その解決ログになります。

https://x.com/ayousanz/status/1880497694424330581

開発環境

  • Unity 6000.0.31f1(Build In Pipeline)
  • lilToon 1.8.5(PackageManager経由でインストール)
  • UniVRM v0.128.1(PackageManager経由でインストール)

問題の概要

  • UnityEdiorではStreamingAssetsフォルダからのVRMのロードは問題なくできる
  • ビルド後のアプリ時にStreamingAssetsにフォルダにVRMファイルを置いてもロードできない

→ 実行ファイルのログを見ると以下のエラーが出ていました

VRM の読み込みまたは表示中にエラーが発生しました: Value cannot be null.
Parameter name: Shader
uDesktopMascot.<LoadModel>d__2:MoveNext()

問題の原因

今回は以下の二つが原因でshaderがロードできていませんでした。
前提として、lilToonおよびMToon(UniVRM)はPackageManager経由でインストールしており、Assets内には含めていません。

1. シェーダー名の不一致

shaderを置き換える際にShader.Findにて、特定のshaderを取得しています。この際にlilToonの検索名が一致しておらずエラーになっていました

2. ビルド時のシェーダーストリッピング

解決方法

1. シェーダー名の不一致

以下のように正しいShaderを指定します。今回はlilToonの半透明Shaderを適用したいので、Hidden/lilToonTransparent を使用しています。

// lilToonの半透明シェーダーを取得
                var lilToonTransparentShader = Shader.Find("Hidden/lilToonTransparent");

2. ビルド時のシェーダーストリッピング

Unityのビルドプロセスでは、使用されていないシェーダーがビルドから除外(ストリッピング)されます。この場合、Editor内では使っていないが、実行時に使う場合はストリッピングされないように設定する必要があります。
以下のように Edit > Project Settings > Graphics > Always Included Shaders に MToonおおよびlilToonを追加します。

追記(特定のモデルでロードできない問題)

ユーザーの方から特定のモデル(今回は 光莉/ ケープ付きコート fur capelet)でロードできない連絡をいただき調査をしたところ、モデルの作り方によっては MToonに変わらず standard shaderが使われていることがわかりました。

そのため、以下のように standard shaderもAlways Included Shadersに追加する必要があります

MidraLab(ミドラボ)

Discussion