【Unity中級者向け】Animator応用編③|LayerとAvatar Maskで「歩きながら話す」アニメーションを作成
前回は2D Blend Treeを使い、キャラクターを上下左右に動かしました。
今回はその移動アニメーションを残したまま、上半身だけに別のアニメーションを重ねます。完成形は「歩きながら腕を動かして話す」キャラクターです。
使用するのは、前回までの移動用Blend Treeと、アニメーション素材に含まれる Talk01。新しい素材を追加せずに検証を進められます。
Animator 応用編【全5回】
Blend Tree入門 ― Idle / Walk / Runを滑らかにつなぐ
2D Blend Tree ― 上下左右の移動アニメーション
Animator Layer / Avatar Mask ― 上半身だけ別アニメーション
Animator Override Controller ― キャラごとにモーションを差し替える
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ビューをクリックして操作できる状態にします。
移動キーでキャラクターを歩かせる
歩きながらTキーを押す
足は歩行を続け、腕や上半身が Talk01 の動きになることを確認する
もう一度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の個別指導のオンラインレッスンを行っています。
ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。
いいなと思ったら応援しよう!
よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!