UnityにVRoidで作ったVRMのモデルに銃を構えながら移動するモーションをブレンドしてみた

前回は複数の歩行から走りへと変化させるようなアニメーションを徐々に変化させるアニメーションを実装しました

UnityにVRoidで作ったVRMのモデルをスクリプトからアニメーション変更させてみた

今回は2つのアニメーションを同時に再生する「モーションブレンド」をやってみたいと思うわ

これで、上半身は攻撃モーションで下半身は移動モーションを再生することで移動しながらの攻撃を表現することが可能だ

今回もUnityの用意された機能で実装可能なので。実装面ではあまり解説することがない部分ではありますが、解説したいと思います

Youtubeでの解説動画

この動画では、今作っているゲームで必要だった「銃をかめながらの移動」といったモーションで解説しています

銃を構えるモーションを0からUnityで作る部分もやっているわ、クオリティは高いとは言い切れないけどね……

とはいえ、Unityだけでもモーションの作成が可能なのはかなり使えそうな技術だと思ったから、今回合わせて動画で紹介させていただいたぞ

モーション作成ではVRMとユニティちゃんでのボーンの長さ?が違うようで微調整が必要だからその点は注意が必要ですね

詳しくコード解説していくよ

今回もコードを書くだけだと崇敬で終わってかなり簡単です

ただ、その複数のアニメーションを再生させるための設定が難しいまでは行かないけど、モーションの成り立ちを理解してないとちょっと理解しにくい感じだったわ

詳しくは動画を見てもらいたいんだけど、
モーションを適応する体の部分を選択する必要があるんだ
底の部分の設定が奥まったところにあったりで、最初は戸惑ってしまったな

今回の「銃を構えて歩く」モーションの場合、銃を構えるモーションを上半身に適応させるように設定する必要が出てきます。歩きのメインとなるモーションは何も設定しなくても大丈夫です

GitHubはこちら

https://github.com/Syungetu/UnitytoVRMProject

前回と同じようにGitHubでソースコードは公開しているから、こちらも参考にしてみてね

ただ、一部の素材、アセットは各自ダウンロードが必要なのでそのあたりは変わりの素材を用意するなりしてね

アセット周りは利用規約として原則自らダウンロードしたもののみというものが多いからな、申し訳ないがご了承してください

アニメーション周りはほとんどアセットストア便りなので、いくつかダウンロードしておくと良いと思います。今回使う歩行アニメーションも無料版がいくつか見つけられると思います
モーションのブレンド処理解説

ModelAnimatorController.cs

変数宣言

なし

今回も既存のアニメーション処理に追加する感じなので、変数を増やすことはありません

肝となる関数は1行で済むからね、下準備はなくて大丈夫ってわけね

モーション処理
/// <summary>
/// アニメーションレイヤーのアニメーションの重さを変化させる
/// </summary>
/// <param name="layer">重さを変えるレイヤー番号(0~)</param>
/// <param name="weight">重さ(0~1)</param>
public void SetByLayerChangeAnimator(int layer, float weight)
{
    if (_ModelAnimator == null)
    {
        return;
    }

    // 指定したレイヤー番号が超えてたら処理しない
    if (_ModelAnimator.layerCount >= layer)
    {
        _ModelAnimator.SetLayerWeight(layer, weight);
    }
}

こちらも動画を参考にしてほしんだけど、Unityのアニメーションにはレイヤーシステムが導入されていて、各モーションを別々で管理することができるんだ

このレイヤーっていうのはレタッチソフトのPhotoshopのようなものと同じものと考えていいと思います。複数のアニメーションをかけ合わせたりして一つのモーションにしていく感じですね

そして、複数のモーションの強さを管理するのが
_ModelAnimator.SetLayerWeight(layer, weight);
って言うわけです。

SetLayerWeightの第一引数に0から始まるレイヤー番号を指定して、
第二引数にそのレイヤーで再生するモーションの強さを設定していくわ


    /// <summary>
    /// アニメーションを変更する
    /// </summary>
    /// <param name="value"> アニメーション名 </param>
    /// <param name="layer"> アニメーションのあるレイヤー番号(0~)  </param>
    public void SetChangeAnimator(string value, int layer = 0)
    {
        if(_ModelAnimator == null)
        {
            return;
        }
        if (_ModelAnimator.layerCount >= layer)
        {
            // アニメーションを切り替える
            _ModelAnimator.Play(value, layer);
        }
    }

それで、ここまではアニメーションの再生するものの設定だけなので、実際に再生する処理も動かす必要があるぞ

と言っても、前に実装したアニメーションを再生する処理の
「Play(value, layer);」を使って各レイヤーのアニメーションを再生すればオッケーです

まとめ

今回本当に説明することが少ないですね(汗
しかし、次回はプログラム面ばかりになるので、こちらの解説が増えると思います

アニメーション周りは自分で1からやろうとするとかなりの鬼門で3Dプログラムでの挫折ポイントでもあるので、かなりUnity側が手厚くサポートしてるわね

かくいう冬月もDirectXでこのアニメーション周りを独自実装してたんだけど、正直全く理解せずに組み上げたからゲームとして組み込めるレベルではなかったんだよな……

いやぁ、Unityができてかなり3Dプログラム周りは脚光を浴びたような気がしますね。冬月もUnityがなかったら3Dプログラムは趣味レベルで止まってたかもしれません

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

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

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

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