#概要
ランタイム(exe)でVRM(MToon)をHDRP(Lit)表示します。
#環境
Unity 2020.3.11f1
UniVRM 0.66.0
#実装
using System.IO;
using System.Collections.Generic;
using UnityEngine;
using VRM;
public class MToonToLit : MonoBehaviour
{
[SerializeField] string FilePath;
[SerializeField] Material Opaque;
[SerializeField] Material Transparent;
void Start()
{
// VRM読み込み
var bytes = File.ReadAllBytes(FilePath);
var context = new VRMImporterContext();
context.ParseGlb(bytes);
context.Load();
context.ShowMeshes();
// MToonをLitに置き換え
var renderers = context.Root.GetComponentsInChildren<Renderer>();
for (int i = 0; i < renderers.Length; i++)
{
var materials = new List<Material>(renderers[i].materials);
for (int j = 0; j < renderers[i].materials.Length; j++)
{
if (renderers[i].materials[j].GetFloat("_BlendMode") != 2)
{
materials[j] = new Material(Opaque);
}
else
{
materials[j] = new Material(Transparent);
}
// 通常と透過を使い分けて色とテクスチャを反映
materials[j].color = renderers[i].materials[j].color;
materials[j].mainTexture = renderers[i].materials[j].mainTexture;
}
renderers[i].materials = materials.ToArray();
}
}
}
#補足
HDRPで作成したプロジェクトのシーンのどこかへ前述のスクリプトを張り付けて、FilePathに読み込みたいVRMファイルのパス、Opaqueに新規作成したHDRP/Litのマテリアルを設定、Transparentには新規作成したHDRP/LitのマテリアルのSurface TypeをTransparentにしてから設定すれば動くと思います。
既知問題として、このままだとUnlitが来た時に失敗して真っ黒になるので、_BlendModeの判定辺りをちゃんとやる必要があります。どうやれば良いかは調べれてません。
#参考
左がHDRP、右がMToonです。
モデル:リンツちゃん改変
https://booth.pm/ja/items/1255264
サンプルアプリ
https://120byte.booth.pm/items/3062310