Unityプログラム解説 VRoid Studioで作ったVRMをUnityに反映 & 目パチさせてみた

プログラム講座、なんか動画でやったらどうなんだろうかーとおもってやってみたんですが意外と楽でいいですね

最近、モデル周りのプログラムをいじるようになったので健忘録として自分がが憂愁した記憶を残していくみたいね

このあたりは意外とネットにも情報が少なかったからまとめておいたほうが良いと思ってな、こうやって動画で残したってわけね

このブログで補足説明とかしたほうが良いと思うのですが、もうちょっと大規模なプログラムを解説し始めたらやろうと思います

解説動画もあるよ!

大部分は動画で解説していますので、
こちらを見ていただけると嬉しいです!

やっぱりこういうのって、実際に動いているのを確認しながらのほうがわかりやすいからね

でもコードを見たいときは、テキスト形式のほうが見やすいんだよねー

ということで、今回のプログラムの要点をここに書いていこうと思います

Githubにプロジェクトをアップロードしてます!

Githubのプロジェクトリンク:
https://github.com/Syungetu/UnitytoVRMProject

解説とかはどうでもいい!
ソースを見せろ!といった方はGithubにプロジェクトファイルを上げてますのでご確認ください~

解説をするために作ったプロジェクトなのであまり難しいことしていないのでロジックに参考にできる物は少ないかもね

このプロジェクトを改良して作るのも全然OKだから、気軽にみていってね

このプロジェクトを利用した場合は「すたじお・くろす!」の明記をしていただけるとうれしいです

動画について補足的解説をします

今回はUnityにVRoid Studioで作成したVRM形式のモデルデータをUnityに取り込んでモデルデータとして使えるようにすることと

そのモデルデータの表情をスプリクトで操作して、目パチを実装するところまで進めていくわ

UnityにVRMを読み込む
UnityにVRMを読み込むのに「UniVRM」というパッケージを使います

Unityには表示でVRMのモデルデータを読み込む機能は付いていないから、外部Unityパッケージを使って機能を追加するぞ

UniVRMのGitHubページ:
https://github.com/vrm-c/UniVRM

動画と少し違いが有るけど、最新版をダウンロードすれば大丈夫だと思います
パッケージをダウンロードしたらUnityにインポートします

このあたりは他のパッケージと追加方法は変わらないですね
[Aseets] → [import Package] → [Custom Package]と選択していくと、パッケージを読み込むダイアログが出てきます

そこに先程ダウンロードしてきたUnityPackageを選択すると、Unity側に反映されるわ。読み込みに結構掛かるけど気長に待ってね

途中パッケージ内のデータでどれを読み込むか確認するダイアログが出てくるけど、基本底は操作せずに「import」ボタンを押してね

いろんなPackageを入れていると、競合することがあってその確認になります、今回はこれしか入れてないので操作は必要ないです
あとはVRMデータをUnityのプロジェクト内に入れれば完了!

インポートが完了しましたら、VRM読み込みの90%終了しました(笑
あとはUnityにVRMデータを認識させればあとは勝手にUnityに読み込めるモデルデータへと変換してくれます

VRMの置場所は
「Assets」ディレクトリの中ならどこでも良いわ、ただ、変換時に色々ファイルが作成されるから、ディレクトリを作っておいたほうが管理がし易いわね

冬月は「Assets/Model/【VRMの名前】」な感じにディレクトリを作ってその中にVRMデータを格納しているぞ
プロジェクトウィンドウの生成されたモデルデータを
ゲームウインドウにドラッグ・アンド・ドロップすれば表示完了です!

生成されたモデルのPrefabデータをゲームウインドウにドラッグ・アンド・ドロップするとこの様にVRMのモデルデータが表示出来ます!

このモデルにはアニメーションは入ってないので、Tの字で表示されます
アニメーションは、Unityで扱っている「humanoid」タイプのアニメーションが動かせます

生成されたモデルにはすでにAnimatorも生成されているので、このAnimatorに歩き、走りなどのモーションデータを追加するか

もしくは、動画内のようにユニティちゃんのAnimatorを流用してモデルアニメーションを組み込むことが出来るぞ

先程追加したVRMのモデルを選択状態にすると、インスペクター画面にAnimatorの項目があります。それのControllerの項目を保管モデルの物に変更すればアニメーションを流用できます

このControllerの項目にある「kuro_AnimationController」という欄をクリックすると、プロジェクトウィンドウのkuro_AnimationControllerを選択した状態にできます

選択された状態で、Animatorウインドウを開くと、この様にモデルモーションを編集する画面になるので、ここにアニメーションさせたいモーションデータを入れると登録できるわ

このあたりはUnityのモデルのアニメーション追加方法と同じだから説明は割愛するね

目パチをさせてみる

最初から追加されている「VRMBlendShapeProxy」を
操作する形で目パチを実装します

VRMを読み込んだときに出来たPrefabには、VRMBlendShapeProxyという、顔の表情をコントロールするスクリプトがアタッチされています

VRMの使用用途的に表情変化が多用されていたため、Unityで実装するために追加されたものだと思います。

Unityを実行中には、インスペクタがこんな表示になっていると思うわ、このスライドを動かすと顔のパーツが動いて表情を変えられるのね

で、ここのスライドを動かすのをスプリクトで行って、目パチを実装してみようって言うわけだな

VRMBlendShapeProxyを受け取る部分の実装

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using VRM; →UniVRMのプログラムを呼び出すのに必要

 

/// <summary>
/// 顔の表情管理
/// </summary>
public class FaceController : MonoBehaviour
{
    /// <summary> 表情を変える時に使う処理 </summary>
    public VRMBlendShapeProxy _VRMBlendShapeProxy;

    →インスペクター上でVRMBlendShapeProxyを

     設定するようにしました

まずはVRMBlendShapeProxyを操作するために受け取りの部分になります
今回は単純に、インスペクター上でVRMBlendShapeProxyを取得できるようにパブリック要素で定義しました

この様にインスペクター上で該当のクラスを設定する必要がありますが、どこにアタッチしてもクラスの設定をすれば動かせるのが便利で冬月は多用しています

必要な数値設定

 

 

[Header(“目パチ処理”)]
/// <summary> 目パチにかかる時間(秒) </summary>
public float _BlinkTime = 0.1f;
/// <summary> 目パチするかどうか </summary>
public bool _IsBlink = true;

/// <summary> 目パチしているかどうか </summary>
private bool _IsPlayBilnk = false;
/// <summary> 目パチ進行カウント </summary>
private float _BilnkPlayCount = 0.0f;
/// <summary> 目パチタイミングカウント </summary>
private float _BilnkTimeingCount = 0.0f;

 

これが目パチで必要な数値類よ
目パチをさせるかのフラグや、目パチにかける時間を外部から設定できるようにしているわ

あとは、内部データとして目パチの閉じている途中か閉じているのかなどを検出するカウントや、ランダムで目パチをするので、タイミングカウントなんかも設定しているぞ

目パチの初期化処理

 


/// <summary>
/// 目パチ周りの初期化処理
/// </summary>
private void SetIniitializationBlinkProcess()
{
    _IsBlink = true;
    _IsPlayBilnk = false;
    _BilnkPlayCount = 0.0f;
    _BilnkTimeingCount = 0.0f;
}

動かす前に初期化します
これはゲームオーバー時などリセットが必要になったときにも呼び出します

目パチさせるタイミングをランダムでカウントする

 

if (_BilnkTimeingCount <= 0.0f)
{
    // 目パチを行うタイミングになった
    _IsPlayBilnk = true;
    _BilnkPlayCount = 0.0f;

 

    // 次の目パチまでの時間
    _BilnkTimeingCount = UnityEngine.Random.Range(1.0f, 5.0f);
}

 

それでは実際の目パチ処理の解説に入ります
まずは目パチをランダムで発生させるために、カウントが0になったら次の目パチまでの時間を設定する処理を作ります

_BilnkTimeingCountが0になったら目パチタイミングね
0になったらランダムで1~5までの値をランダムで入れるようにしているわ

目の開き具合を設定する処理

 

// 目パチ実行中はif文を通る
if (_IsPlayBilnk == true && _BilnkTimeingCount > 0.0f)

{
    // 目パチ実行中
    _BilnkPlayCount += Time.deltaTime;

    // モーフィングの強さ
    float buffValue = 0.0f;
    if (_BilnkPlayCount <= (_BlinkTime / 2.0f))
    {
        // 目を閉じる
        buffValue = _BilnkPlayCount / (_BlinkTime / 2.0f);
    }
    else if (_BilnkPlayCount <= _BlinkTime)
    {
        // 目を開く
        buffValue = 1.0f – (_BilnkPlayCount – (_BlinkTime / 2.0f)) / (_BlinkTime / 2.0f);
    }

    // 目パチ終了
    if (_BilnkPlayCount > _BlinkTime)
    {
        _IsPlayBilnk = false;
        buffValue = 0.0f;
    }

VRMBlendShapeProxyは目の瞼の動きを0で完全に閉じた状態、1で完全に開いた状態で操作するぞ

目パチの時間を設定しているので、その時間に合わせて目の開き具合を決めている感じです。

目の閉じ具合をVRMBlendShapeProxyに反映させる
if (_VRMBlendShapeProxy != null)
{
    // モーフィングさせる処理
    _VRMBlendShapeProxy.ImmediatelySetValue(
        BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink),
        buffValue
    );
}
VRMBlendShapeProxyにはどのパーツを変化させるのかの関数が有るので、それに値を代入すれば目パチを表現できます。

VRMBlendShapeProxy.ImmediatelySetValue()というのが変化差させるための関数ね、第一引数にはどの部位を動かすのかを指定するわ

BlendShapeKey.CreateFromPreset()ていうのはおまじないのようなもので、その関数の引数に指定したBlendShapePreset.Blinkがまぶたを動かす指定になるぞ

最後に瞬きするタイミングのカウントを行います

 

if (_IsPlayBilnk == false && _BilnkTimeingCount > 0.0f)
{
    // 次の目パチまでのカウント
    _BilnkTimeingCount -= Time.deltaTime;
}

 

最後に最初に設定した瞬きのカウントをさせて目パチ処理は完了です

ということで、今回はUnityにVRoid Studioで作ったVRMモデルデータを表示させて、目パチしてみました

このあたりは整備されててカナリ簡単になったから、気軽に試してみてね

冬月もVRMで作ったモデルを自作ゲームで動かせるように、ゲーム制作中だ

3Dゲームでキャラモデルの用意って一つの難関ポイントだったのですが、それがこうやって手軽になったのは嬉しいですね

気軽にコメントをどうぞ!

この記事に関すること冬月に聞きたいこと等、小さいことでもコメントしていただける嬉しいです。冬月に直接連絡したい方は下のお問合せフォームをお使いください。(メール送信されます)

内容に問題なければ、下記の「コメントを送信する」ボタンを押してください。※メールアドレスは公開されることは有りません。

Unity | ゲーム製作の関連記事