見出し画像

【Unity中級者向け】Animator応用編③|LayerとAvatar Maskで「歩きながら話す」アニメーションを作成

前回は2D Blend Treeを使い、キャラクターを上下左右に動かしました。

今回はその移動アニメーションを残したまま、上半身だけに別のアニメーションを重ねます。完成形は「歩きながら腕を動かして話す」キャラクターです。

使用するのは、前回までの移動用Blend Treeと、アニメーション素材に含まれる Talk01。新しい素材を追加せずに検証を進められます。

Animator 応用編【全5回】

  1. Blend Tree入門 ― Idle / Walk / Runを滑らかにつなぐ

  2. 2D Blend Tree ― 上下左右の移動アニメーション

  3. Animator Layer / Avatar Mask ― 上半身だけ別アニメーション

  4. Animator Override Controller ― キャラごとにモーションを差し替える

  5. StateMachineBehaviour ― Stateの開始・終了に処理を入れる



今回作るもの

キャラクターの動きを、次の2つに分けます。

部分再生するアニメーション下半身前回作成した移動用Blend Tree上半身Talk01

何も設定せずにTalk01を再生すると、移動アニメーション全体が置き換わってしまいます。そこで使うのが Animator Layer と Avatar Mask です。

  • Animator Layer:アニメーションを重ねるための層

  • Avatar Mask:その層を体のどの部分に適用するかを決める設定

今回は「移動の層」の上に「会話の層」を重ね、会話の動きが上半身にだけ反映されるようにします。


事前準備

前回作った、移動用のAnimator Controllerを使用します。Base Layerには、Idleと各方向のWalkを登録した2D Blend Treeがある状態です。

会話用には、HumanM@Talk01 の中にあるアニメーションClip HumanM@Talk01 を使用します。ProjectウィンドウでFBXの左にある三角を開くと、Clipを確認できます。

Talk01を選択してプレビューを再生し、腕や上半身に動きがあることを確認しておきましょう。

※この記事では、キャラクターとTalk01がどちらもHumanoidとして使用できる状態を想定しています。


1. AnimatorにLayerを追加する

Animatorウィンドウの左上にある Layers タブを開き、+ ボタンから新しいLayerを追加します。名前は UpperBody にしておきましょう。

Layersには、次の2つが並びます。

  • Base Layer:前回作った移動用Blend Tree

  • UpperBody:今回追加する会話用Layer

UpperBodyの設定では、BlendingをOverride、Weightを1 にします。

Override は、UpperBodyで指定した体の部分を、このLayerの動きで上書きする設定です。
Weight が 0 だと上のLayerの動きが反映されないため、まずは1で確認します。


2. UpperBodyにTalk01を登録する

Animatorウィンドウで UpperBody を選択します。
ここには、Base Layerとは別のステート構成を作れます。

まずAnimatorウィンドウの空の場所を右クリック
Create State → Empty
で空のステートを作成します。
名前は UpperIdle とし、このLayerのデフォルトステートに設定します。

次に、Projectウィンドウから Talk01のAnimationClip を UpperBody のグラフ内にドラッグ、名前を Talk01 に変更しておきます。

この時点では、UpperBodyは次の2ステートです。

  • UpperIdle:通常時。上半身に追加の動きを再生しない

  • Talk01:会話中に再生する

初めからTalk01をデフォルトステートにすると、常に会話の動きを続けてしまいます。
空のステートを用意すると、会話するときだけTalk01へ切り替えられます。


3.会話用のParameterとTransitionを作る

Animatorの Parameters タブで、Bool型のParameterを追加します。名前は IsTalking にします。

続いてUpperBody内で、次のTransitionを作成します。

両方のTransitionで Has Exit TimeをOFF にすると、IsTalkingの変更に合わせて切り替わります。
Transition Durationは、まず 0.1秒程度 を目安に設定しましょう。

Talk01を繰り返し再生したい場合は、Clipのインポート設定で Loop Time も確認してください。

ここまでで会話用Layerはできました。ただし、まだ上半身だけに限定していません。


4. Avatar Maskを作成する

Projectウィンドウの空いている場所を右クリックして、
Create → Animation → Avatar Mask
を選びます。
作成したMaskは UpperBodyMask とリネームしておきます。

UpperBodyMaskを選択すると、Inspectorで体の部位を指定できます。Humanoidの体の図を使い、今回は次のように設定します。

  • 上半身・左右の腕:有効

  • 左右の脚・Root:無効

  • 頭:Talk01の動きに合わせて任意

頭のうなずきも会話の動きとして使いたければ、頭も有効にします。まずは腕と上半身の変化が見やすい設定で試しましょう。

Avatar Maskは、Talk01のClipそのものを編集するものではありません。「UpperBody Layerの動きを、体のどこに反映するか」を指定します。


5. LayerにMaskを割り当てる

Animatorウィンドウの Layers タブに戻り、UpperBody の設定を開きます。

Mask の欄に、先ほど作った UpperBodyMask を指定してください。あわせて、Blendingが Override、Weightが 1 になっていることを確認します。

これで構成は完成です。


6. 再生して動きを確認する

ここまでの設定で、Animatorの IsTalking をオンにすると、上半身のレイヤーが Talk01 に切り替わるようになりました。
最後に、ゲーム中に Tキーで会話の動きを切り替えられるようにします。

前回作成した Player2DController.cs に、次の処理を追加します。

public class Player2DController : MonoBehaviour
{
    float moveSpeed = 3f;  
    Animator animator;      
    bool isTalking;         // 会話中かどうか

    void Awake()
    {
        animator = GetComponent<Animator>();
    }

    void Update()
    {
        float stepX = Input.GetAxis("Horizontal");
        float stepY = Input.GetAxis("Vertical");

        animator.SetFloat("MoveX", stepX);
        animator.SetFloat("MoveY", stepY);
        // ここまで記述済み

        // Tキーを押すたびに、会話の開始・終了を切り替える
        if (Input.GetKeyDown(KeyCode.T))
        {
            isTalking = !isTalking;
            animator.SetBool("IsTalking", isTalking);
        }

        //以下記述済み
        Vector3 direction =
            transform.right * stepX + transform.forward * stepY;
        transform.position +=
            direction.normalized * moveSpeed * Time.deltaTime;
    }
}

追加した処理の中心は、次の部分です。

isTalking = !isTalking;
animator.SetBool("IsTalking", isTalking);

! は true と false を反転する記号です。Tキーを1回押すと isTalking が true になり、もう1回押すと false に戻ります。
その値をAnimatorの IsTalking パラメータに渡しています。


再生して確認しよう

ゲームを再生したら、Gameビューをクリックして操作できる状態にします。

  1. 移動キーでキャラクターを歩かせる

  2. 歩きながらTキーを押す

  3. 足は歩行を続け、腕や上半身が Talk01 の動きになることを確認する

  4. もう一度Tキーを押し、通常の移動アニメーションに戻ることを確認する

停止中にもTキーを押して、会話の動きが切り替わるか試してみましょう。


Maskを外すとどうなる?

UpperBodyからAvatar Maskを一度外し、同じようにIsTalkingをONにしてみてください。

Talk01の動きが全身に影響すると、歩行との組み合わせが不自然になる場合があります。もう一度UpperBodyMaskを設定すると、下半身にはBase Layerの移動が残ります。

Maskあり・なしを比べることが、Avatar Maskの役割を理解する近道です。


動かないときの確認ポイント


Talk01は会話の身振りなので、攻撃ほど大きな動きではありません。
確認するときは、GameビューやSceneビューでキャラクターを少し大きく映すと分かりやすくなります。


攻撃アニメーションにも応用できる

今回のTalk01を攻撃Clipに置き換えれば、歩きながら上半身だけで攻撃する表現にも応用できます。移動用Blend Treeと上半身用Maskの考え方は同じです。

攻撃用のClipを追加したい場合は、Unity Asset Storeの無料素材「Human Melee Animations FREE」などが候補になります。

今使っているTalk01と同じKevin Iglesias製の素材です。
ただし、攻撃動作によっては武器を持たせたり、体のひねりに合わせてMaskの範囲を調整したりする必要があります。

まずはTalk01で仕組みを理解してから、好きなモーションに差し替えてみましょう。


まとめ

今回は、Animator LayerとAvatar Maskを使って、移動と会話のアニメーションを組み合わせました。

  • Layerで、移動と会話の動きを別々に管理する

  • Avatar Maskで、会話の動きを上半身だけに適用する

  • Base Layerの移動用Blend Treeを残したまま、別の動きを重ねられる

これでキャラクターは、歩く動きを止めずに上半身で別の動作ができるようになりました。

次回は Animator Override Controller を使い、Animator Controllerの構成を共有したまま、キャラクターごとにアニメーションClipを差し替える方法を見ていきます。



こちらはUnity初心者向けの記事をテーマ別にまとめています。
▼ Unity初心者向け記事まとめはこちら


こちらのマガジン「ミニゲーム作成講座 全8回セット」でもシーンの切り替えなどを活用して、初心者でも知識ゼロから作れるミニゲーム作成講座を紹介しています。

さらにステップアップの「スマホで遊ぶジャンプゲーム 8回セット」のマガジンもぜひご活用ください。


ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。
ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。

いいなと思ったら応援しよう!

ファイブボックス よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!