Unityプログラム解説 銃を構えるモーションと歩くモーションをブレンドさせてみた

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

Unityプログラム解説 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プログラムは趣味レベルで止まってたかもしれません

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

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

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


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

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