FC2ブログ
Le petit jardin

Welcome to my blog!

サンプルを動かしてみる

2020/02/02
Unity 0
今回はサンプルのダンスファイルを動かして、
VRMモデルもインポートしてみます。

既に多数記事があるので何番煎じかわかりませんが
とりあえずはじめから記録していきます。

まず、Unity Hub をインストールします。
特に説明は必要ないと思うので端折ります。

立ち上げると使うプロジェクトを聞いてくるので、
今回は「Unity Demo1」としておきます。
→名前(フォルダ名)は特になんでもいいです。

Unity

ここにサンプルのファイルをインポートします。
ダンスファイルはこれを使います。

参照ページ

解凍すると「unitychan-crs-master」という
フォルダができて、ここに各種ファイルが入ってます。
先程作ったプロジェクトにこのファイルを使います。

整理しやすいように「Assets」の中に「Assets」をいれて
名前を「unitychan-crs」に変更します。
※「unitychan-crs-master」のフォルダはインポートできないようです。

Unity起動後

Assetをインポート

インポートしただけだと何も起きないので、
「unitychan-crs」→「Scenes」の中にある「Main」を
ダブルクリックまたはヒエラルキーにD&Dします。
※D&Dした場合はシーンが2つできますが再生もできます。

シーンを追加

D&Dした場合
D&Dした場合

ダブルクリックした場合
ダブルクリックした場合

再生してみる
再生してみる

とりあえず、これだけで再生できます。
では、このユニティちゃんをVRMに置き換えていきます。
VRMはデフォルトだとUnityにインポートできないので
「UniVRM」というツールを使います。

UniVRMをインポート

このパッケージをプロジェクトが開いている状態で実行します。
すると、インポートできるようになります。

UniVRMをインポート

VRMという項目が追加されました
メニューが増えた

Unityの工程は一旦置いて、VRMの作成です。
VRMモデルは「VRStudio」というツールを使います。

VRoidStudio

インストールしているものとして進めます。
サンプルをロードしてとりあえずそのまま「VRM」として
エクスポートします。解りやすくするためフォルダを
一つ作ってその中にVRMファイルを入れておきます。
ここでは「Sample Model 1」としておきます。

VRStudio

VRStudio

VRStudio

VRStudio

VRStudio

VRStudio

Unityに戻ります。
このフォルダをUnity(Asset)にインポート(D&D)

Unityへインポート

このままでは何も起きないので、
モデルを描画させて動くようにします。

モデルを描画するためにインポートしたモデルを
「ヒエラルキー」にD&Dします。

表示させる

モデルが表示されました。

表示されたけど暗い


表示されましたが暗いので照明をいれて、
ユニティちゃんと同じように動くようにします。
「ヒエラルキー」で右クリックして照明を追加
とりあえず、「ディレクショナルライト」でいいかと。

ライトを追加

明るくなった

「アニメーター」の「Controller」を「MocapC86」
にセットします。右端のちっちゃい「○」を
クリックするとリストが表示されます。
加えて「ルートモーションを適応」にチェック
これが入ってないとその場で踊るだけになります。

モーション設定

まばたきもしてほしいのでセットします。
「コンポーネント追加」→「スクリプト」→「VRM」
→「Blinker」を選択します。
「bl」とかで検索かけたほうが早いです。

まばたきを追加


初期位置だとユニティちゃんとだぶるので
適当にずらしておきます。

初期位置変更

この状態で再生してみましょう。

動いた

ちゃんと動いているようですね。
左上の「Scene」をクリックすると
視点が変更できるみたいです。

視点は自由

続いてリップシンクも入れてみます。
これはスクリプトを使ってい動いているので、
それをちょっと書き換える必要があるようです。

リップシンクのスクリプト

ここに入っている
「LipSyncController.cs」を編集

using UnityEngine;
using System.Collections;
using VRM;                  //追記

public class LipSyncController : MonoBehaviour
{
    public string targetName;

    public Transform nodeA;
    public Transform nodeE;
    public Transform nodeI;
    public Transform nodeO;
    public Transform nodeU;

    public AnimationCurve weightCurve;

    VRMBlendShapeProxy target;                  //追記
    // SkinnedMeshRenderer  target;

    void Start()
    {
        target = GameObject.Find(targetName).GetComponent();    //変更
        // target = GameObject.Find(targetName).GetComponent();
    }

    float GetWeight(Transform tr)
    {
        return weightCurve.Evaluate(tr.localPosition.z);
    }

    void LateUpdate()
    {
        // var total = 100.0f;     //Unity-Chan

        // var w = total * GetWeight(nodeA);
        // target.SetBlendShapeWeight(6, w);
        // total -= w;

        // w = total * GetWeight(nodeI);
        // target.SetBlendShapeWeight(7, w);
        // total -= w;

        // w = total * GetWeight(nodeU);
        // target.SetBlendShapeWeight(8, w);
        // total -= w;

        // w = total * GetWeight(nodeE);
        // target.SetBlendShapeWeight(9, w);
        // total -= w;

        // w = total * GetWeight(nodeO);
        // target.SetBlendShapeWeight(10, w);


        var total = 1.0f;      //VRM用に変更

        float w = total * GetWeight(nodeA);
        target.ImmediatelySetValue(BlendShapePreset.A, w);
        total -= w;

        w = total * GetWeight(nodeI);
        target.ImmediatelySetValue(BlendShapePreset.I, w);
        total -= w;

        w = total * GetWeight(nodeU);
        target.ImmediatelySetValue(BlendShapePreset.U, w);
        total -= w;

        w = total * GetWeight(nodeE);
        target.ImmediatelySetValue(BlendShapePreset.E, w);
        total -= w;

        w = total * GetWeight(nodeO);
        target.ImmediatelySetValue(BlendShapePreset.O, w);
    }
}


こんな感じに編集します。


ただ、ユニティちゃんと同時処理のやり方がまだわからない
ので、どちらかしかリップシンクできません。
これはスクリプトを修正しただけなので、これを
追加したモデルに適応させます。
「Face Update」とあとユニティちゃんのリップシンクはオフに。

ここの設定を追加したモデルに適応
リップシンクのスクリプト

コンポーネントをコピペ
リップシンクのスクリプト

リップシンクのスクリプト

ターゲットの名前を変えて、ユニティちゃんのはオフに
リップシンクのスクリプト

Face Updateを追加
リップシンクのスクリプト

リップシンクのスクリプト

一つだけバグが残っているようですが、今回は動かすだけが
目的なのでとりあえずこれで。


ちゃんと口も動いています

リップシンクもOK?

次回は基本的なUnityの使い方についてです。


ここまでの流れは以下のサイトを参考にさせていただきました

「VRoid Studio」で作った3Dモデルを「Unity」で踊らせてみよう

Comments 0

There are no comments yet.
Mithril
Admin: Mithril

趣味は主に雑学です。
どうでもいいこと書いてます。

Blenderやプログラムに
ついても書いたりするかも。
私のPC環境はこちら

コメントなどは「Twitter」まで
Unity