💃

Unity-HDRPでMMDを動かしつつ、ピンクのシェーダエラーも解消する

2023/08/07に公開

概要

背景

バーチャルライブのアセットを作る際、MMDのモデルやダンスモーションをUnityで動かしてデモを作ることが多いのですが、毎回「手順どうだっけ?」となって非効率な気がしています。そこで、この記事をたどれば大体のtipsが分かる感じにしたら良さそうだなあと思いました。

目的

手順をテンプレ化し、同じ工程をたどる度にノウハウを加筆していけるようにする。スクラップで書くような箇条書きのメモだと、後から見る気がなくなってしまうので、文章で書いて再利用性を高める。

範囲

UnityやMMDに関する詳細な解説は他の記事に委ねます。表情やリップシンクの適用はいったん扱いません。

制約

MMDに詳しくなくてもできるようにする。

前提

HDRPテンプレート上で動かします。

成果

準備

HDRPプロジェクト作成。

必要なアセットをインポートする。
https://stereoarts.jp/

一番上のUnityPackageだけで大丈夫です。

YYBさんの初音ミクNTモデルをお借りします。
https://www.nicovideo.jp/watch/sm41007053
上記動画にいいねすると、パスワードが表示されます。

それを使って、下記リンクからDLします。
https://bowlroll.net/file/284019

解凍したフォルダごとインポートします。

モーションのインポートをします。下記モーションをお借りします。
https://bowlroll.net/file/188581

.rarファイルがDLされるので、7-Zipで展開してフォルダごとUnityにインポートします。

モデルフォルダに、青い視覚と赤い{}のようなアイコンのアセットが生成されているのでクリック。
規約周りに同意した後、好きなモーション
.vmdを登録してProcessを押すと変換が始まります。

よく、アバターをhumanoidにすることが推奨されているのですが、そうすると髪が固まって、個別に揺れものをセッティングしないといけなくなります。

その場合は、Magica Clothがおすすめです。
https://magicasoft.jp/magica-cloth/

しばらくしたら.prefabが生成されています。

これをヒエラルキーに表示させると、シェーダがHDRPに対応していないのでピンクになっています。これを直していきます、

マテリアルセッティング

下記エディタ拡張を使って変換します。

ShaderConverter.cs
using UnityEngine;
using UnityEditor;

public class ShaderConverter : EditorWindow
{
    GameObject selectedObject;
    Shader newShader;
    float metallic = 0f;
    float smoothness = 0.5f;

    [MenuItem("Tools/ShaderConverter")]
    public static void ShowWindow()
    {
        GetWindow<ShaderConverter>("Shader Converter");
    }

    private void OnGUI()
    {
        GUILayout.Label("Shader Converter", EditorStyles.boldLabel);

        selectedObject = EditorGUILayout.ObjectField("Target GameObject", selectedObject, typeof(GameObject), true) as GameObject;
        newShader = EditorGUILayout.ObjectField("New Shader", newShader, typeof(Shader), false) as Shader;

        metallic = EditorGUILayout.Slider("Metallic", metallic, 0f, 1f);
        smoothness = EditorGUILayout.Slider("Smoothness", smoothness, 0f, 1f);

        if (GUILayout.Button("Convert Shaders"))
        {
            ConvertShaders(selectedObject, newShader);
        }
    }

    private void ConvertShaders(GameObject target, Shader shader)
    {
        if (target == null || shader == null)
        {
            Debug.LogError("Target or Shader is not specified.");
            return;
        }

        Renderer[] renderers = target.GetComponentsInChildren<Renderer>();
        foreach (var renderer in renderers)
        {
            foreach (var material in renderer.sharedMaterials)
            {
                if (material == null) continue;

                // Preserve texture
                Texture mainTexture = material.mainTexture;

                // Change shader
                material.shader = shader;

                // Set new shader properties
                if (material.HasProperty("_Metallic"))
                {
                    material.SetFloat("_Metallic", metallic);
                }
                if (material.HasProperty("_Smoothness"))
                {
                    material.SetFloat("_Smoothness", smoothness);
                }

                // Reassign texture
                material.mainTexture = mainTexture;
            }
        }
    }
}

Search: Allで検索することで、Litシェーダが見つかります。

変換できました。

プロジェクトを開き直すと、シェーダがもとに戻る現象が起こります。おそらく、MMDmechanimが走っているのかもしれないです。MMDmechanimに依存しない状態にモデルをセットして、MMDmechanimを削除したらよいかもしれません。

自分の場合は、踊る演者を用意してデモを作りたい用途なので、がこうしてエディタ拡張を作って一撃で変換できるようにしています。

動かす

MMDの.prefabに格納されている.animを、ヒエラルキーのMMDモデルのゲームオブジェクトにドラック&ドロップすると、animation controllerが生成されます。

ゲーム開始すると動きます。

表情やリップシンクの適用はいったん扱いません。さくっと表情が反映される場合とされない場合があります。

↓表情とリップシンクをつけた例
https://twitter.com/toshikun_0112/status/1688381280206151680?s=20

表情を追加するとだいぶちがうので、別途扱います。

追補

MMDのカメラワークを移植するスクリプト

https://github.com/vrMarimo/mmd_cameraload

Discussion