【Unity】Unity 3Dキャラクターアニメーション実践:8方向移動と上半身制御をAnimatorで作る

作成: 2025-12-07最終更新: 2026-07-13

WASDで8方向に滑らかに動き、走りながら上半身だけ攻撃する——3Dキャラクターらしい動きの正体は、2D Blend Tree・Avatar Mask・Root Motionの組み合わせです。Animator Controllerの基本を卒業した人向けに、3Dキャラ特有のテクニックを解説します。

WASDで前後左右に滑らかに動き回り、Shiftで走り、走りながら上半身だけで攻撃する——3Dアクションゲームの「当たり前の動き」は、実は複数のテクニックの組み合わせでできています。

8方向移動は2D Blend Tree、部位別のアニメーションはAvatar Mask、移動の主導権はRoot Motionの設定——この記事では、Animator Controllerの基本を卒業した人向けに、3Dキャラクター特有のこの3点セットを解説します。

3Dキャラクターアニメーションのイメージ。粘土のキャラクターが待機・歩き・走り・攻撃のポーズで連続して並んでいる

この記事でわかること

  • HumanoidリグとAvatarによる アニメーションの使い回し(リターゲティング)
  • 2D Blend Tree で作る8方向移動(前後+ストレイフ)
  • SetFloatdampTime で入力の急変化を滑らかにする
  • LayersとAvatar Mask で「走りながら攻撃」を作る
  • Root Motion ——移動の主導権をアニメとスクリプトのどちらに渡すか
  • 3点セットを1体に統合する実践——8方向に移動しながら、上半身で撃つ

前提: Animator Controllerの基本(State・Transition・Parameters・1D Blend Tree)は Animator Controller入門 で解説しています。ステートマシンに初めて触れる方はそちらから読むのがおすすめです。

Sponsored

HumanoidリグとAvatar:アニメを使い回す仕組み

3Dキャラクターのアニメーション制作で最初に押さえるべきは、自分でアニメーションを作らなくても、他人の作ったアニメーションを使い回せるということです。それを可能にするのがHumanoidリグとAvatarシステムです。

モデルのインポート設定でRigタブのAnimation TypeHumanoidにすると、Unityはそのモデルの骨格を標準的な人型ボーン構造にマッピングしたAvatarアセットを生成します。この共通の「人型の設計図」を介することで、 体型がまったく違うキャラクター同士でアニメーションを再利用(リターゲティング) できます。

アセットストアで買った「歩き」を自作キャラに、Mixamoの「攻撃」をチームメイトのキャラに——リターゲティングは3Dゲーム開発の物量問題を解決する土台です。仕組みの詳細は 3Dモデルインポートの記事 で解説しています。

2D Blend Treeで8方向移動を作る

「Idle→Walk→Run」のような一直線の変化なら、パラメータ1つの1D Blend Treeで作れます(基本記事参照)。しかしTPSやRPGでよくある 「前を向いたまま横や後ろに移動する(ストレイフ)」 は、前後と左右という2つの軸が必要です。ここで使うのが2D Blend Treeです。

2D Blend Treeによる8方向移動の概念図。中央のキャラクターから8方向に床矢印が伸び、前進・後退・左右ストレイフの4方向は青い矢印(用意するアニメーション)、斜め4方向は光るシアンの矢印(ブレンドで自動生成)で描かれている

作成手順

  1. まずParametersタブでFloat型のパラメータを2つ作ります: ForwardSpeed(前後)とRightSpeed(左右)。
  2. Animatorウィンドウの空きスペースで右クリック →Create State > From New Blend Tree。ダブルクリックで編集モードへ。
  3. InspectorでBlend Type2D Freeform Cartesianに変更し、ParametersにX軸=RightSpeed・Y軸=ForwardSpeedを指定します。
  4. Add Motion Fieldでアニメーションを座標に配置していきます。
座標 (X, Y)アニメーション
(0, 0)待機 (Idle)
(0, 0.5)前進歩行 (Walk Forward)
(0, 1)前進走行 (Run Forward)
(1, 0)右ストレイフ (Strafe Right)
(-1, 0)左ストレイフ (Strafe Left)
(0, -0.5)後退 (Walk Backward)

これで、2つのパラメータ値が示す「座標」の周囲にあるアニメーションが自動的にブレンドされます。ForwardSpeed = 0.75なら歩きと走りが混ざった早歩きに、(0.5, 0.5)なら「右斜め前への移動」になります。斜め移動用のアニメーションを用意しなくても、縦横のブレンドで補間してくれるのが2D Blend Treeの強力なところです。

Sponsored

スクリプトからの制御とdampTime

スクリプト側の仕事は、入力を2つのパラメータに渡すことだけです。ここでのポイントはSetFloatの第3引数 dampTime です。

using UnityEngine;

[RequireComponent(typeof(Animator))]
public class CharacterAnimatorController : MonoBehaviour
{
    private Animator animator;

    // パラメータ名はハッシュ化しておくと高速かつタイプミスに強い
    private static readonly int ForwardSpeedHash = Animator.StringToHash("ForwardSpeed");
    private static readonly int RightSpeedHash = Animator.StringToHash("RightSpeed");

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

    void Update()
    {
        float right = Input.GetAxis("Horizontal");   // A/Dキー: -1.0 ~ 1.0
        float forward = Input.GetAxis("Vertical");   // W/Sキー: -1.0 ~ 1.0

        // dampTime(0.1秒)を指定すると、値が目標へ滑らかに追従する
        animator.SetFloat(ForwardSpeedHash, forward, 0.1f, Time.deltaTime);
        animator.SetFloat(RightSpeedHash, right, 0.1f, Time.deltaTime);
    }
}

キーを離した瞬間に入力は1.0 → 0.0へ急変しますが、dampTimeを指定しておけばパラメータは0.1秒かけて滑らかに減衰します。「走り→急停止」がカクッと切り替わらず、自然な減速に見えるのはこの一手間のおかげです。

LayersとAvatar Maskで上半身だけ動かす

「走りながらリロードする」「歩きながら手を振る」——下半身と上半身で別々のアニメーションを同時に再生したいときは、Layers(レイヤー)Avatar Mask(アバターマスク) を組み合わせます。

Avatar Maskの概念図。ベースレイヤーの走りアニメーションに、上半身だけを白く塗ったAvatar Maskを通した攻撃アニメーションが重なり、走りながら剣を振るキャラクターが完成する

手順

  1. Projectウィンドウで右クリック →Create > Avatar Mask。人型の図で 上半身だけを有効(緑) にします。
  2. AnimatorウィンドウのLayersタブで+を押して新規レイヤー(例: UpperBody)を追加します。
  3. レイヤーの歯車アイコンから、Maskに作成したAvatar Maskを設定し、Weight1にします。
  4. BlendingOverride(そのレイヤーのアニメで上書き)が基本です。Additiveは「既存の動きに差分を加算する」特殊用途です。

これでベースレイヤーが下半身の走りを、UpperBodyレイヤーが上半身の攻撃を担当し、1体のキャラクターで2つのアニメーションが合成されます。FPS・TPS・アクションRPGでは事実上必須のテクニックです。

Root Motion:移動の主導権はどちらに?

AnimatorコンポーネントのApply Root Motionは、キャラクターを実際に動かすのは誰かを決めるスイッチです。

Root Motionの比較図。オンではアニメーション自体がキャラクターを前へ運び、オフではアニメーションはその場で再生されスクリプトが移動を担当する
  • オン(Root Motion): アニメーションに含まれる移動・回転がそのままキャラクターに適用されます。モーションと移動距離が完全に一致するので、攻撃の踏み込みや回避ローリングなどモーション主導のアクションに向きます。
  • オフ(スクリプト主導): アニメーションはその場で再生され、移動はCharacterControllerRigidbodyを使ってスクリプトが担当します。移動速度をゲームデザイン側で自由に調整でき、操作性を細かくチューニングしたいゲームに向きます。

判断基準は1行です。 「移動量を決めるのはモーションか、ゲームロジックか」 ——両方をオンにすると移動が二重適用されて滑ったり吹っ飛んだりするので、主導権は必ずどちらか一方に渡してください。

実践:8方向に移動しながら、上半身で撃つ

仕上げに、この記事の3点セットを1体に統合します。TPSの主人公はもちろん、見下ろしARPGのガンナー、ローグライトの遠距離職——「動きながら別の仕事をする体」は全部この構造です。最初にRoot Motionの主導権を決めます。今回は オフ(スクリプト主導) と宣言してから始めます。

移動しながら撃つキャラの完成イメージ。下半身はBase Layerが担当して横方向へ走り、上半身はUpperBodyレイヤーが担当して正面へ銃を構えている

組み立ては3ステップです。

  1. Base Layer: 2D Blend Treeの8方向移動(本文の設定そのまま)
  2. UpperBodyレイヤー: Avatar Maskで上半身のみ・Weight 1。射撃Stateを置き、Shoot(Trigger)で入り、Has Exit Timeオンで自動で戻す
  3. スクリプト: ここに、この実践最大の罠が潜んでいます

カメラ基準で移動するキャラでは、 Blend Treeに渡すのは「入力」ではなく「キャラから見た移動方向」 です。ワールド空間の移動方向をそのまま渡すと、カメラを回した瞬間に破綻します。

using UnityEngine;

[RequireComponent(typeof(Animator))]
public class StrafeShooter : MonoBehaviour
{
    [SerializeField] private Transform cameraTransform;

    private Animator animator;
    private static readonly int ForwardSpeedHash = Animator.StringToHash("ForwardSpeed");
    private static readonly int RightSpeedHash = Animator.StringToHash("RightSpeed");
    private static readonly int ShootHash = Animator.StringToHash("Shoot");

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

    void Update()
    {
        // カメラ基準の移動方向(ワールド空間)を作る
        Vector3 camForward = cameraTransform.forward; camForward.y = 0f;
        Vector3 camRight = cameraTransform.right; camRight.y = 0f;
        Vector3 worldMove = camForward.normalized * Input.GetAxis("Vertical")
                          + camRight.normalized * Input.GetAxis("Horizontal");

        // ここが肝: ワールドの移動方向を「キャラから見た方向」へ変換して渡す
        Vector3 localMove = transform.InverseTransformDirection(worldMove);
        animator.SetFloat(ForwardSpeedHash, localMove.z, 0.1f, Time.deltaTime);
        animator.SetFloat(RightSpeedHash, localMove.x, 0.1f, Time.deltaTime);

        // 射撃はUpperBodyレイヤーの仕事。下半身は走り続ける
        if (Input.GetMouseButtonDown(0))
        {
            animator.SetTrigger(ShootHash);
        }
    }
}

わざと壊して、直す

  1. InverseTransformDirectionを消してworldMoveを直接渡す: カメラが後ろにいる間は普通に見えますが、カメラを横へ回すと前進しているのに足は後退という不気味な走りになります。「入力座標」と「キャラの体の座標」は別物——この1行がそれを翻訳しています
  2. UpperBodyレイヤーのWeightを0のまま忘れる: 撃ってもまったく無反応になります。レイヤーを足した直後のWeightは0なので、「射撃が動かない」の最有力容疑者です(Avatar Maskで腕を塗り忘れた場合も同じ症状になります)
  3. Apply Root Motionをオンに戻す: スクリプトの移動と二重になり、キャラが滑るように速く動きます。最初に宣言した主導権を守りましょう

Playして、カメラをぐるっと回しながら8方向に動いてみてください。どの向きでも足運びが移動方向と一致し、走りながらでも後ずさりしながらでも上半身が銃を構えて撃てて、手を止めればIdleにすっと戻る——このキャラが動いたとき、あなたは3Dキャラアニメの土台を全部使いこなしています。

おまけ:先に知っておくと良いこと

  • Animation Events: アニメーションの特定フレームでスクリプトの関数を呼べる機能です。「剣が振り下ろされた瞬間に当たり判定を出す」「足が地面に着いた瞬間に足音を鳴らす」はこれで作ります。
  • Foot IK: Humanoidでは、階段や斜面で足が地面にめり込まないよう接地を自動補正するIK(Inverse Kinematics)が使えます。ステートのInspectorでFoot IKをオンにするところから試せます。
  • Animator Override Controller: ステートマシンの構造は同じままアニメーションクリップだけ差し替える仕組みです。敵のバリエーション量産に便利です(基本記事のOverride Controllerの節 参照)。
  • カメラとの連携: TPSのストレイフ移動は「キャラが常にカメラの向きを向く」制御とセットで完成します。カメラワークは Cinemachineの記事 を参照してください。

まとめ

3Dキャラクターの「当たり前の動き」は、この3点セットで作れます。

  • Humanoid+Avatarでアニメーションを使い回す。自作しない、が3Dの基本戦略。
  • 8方向移動は2D Blend Tree2D Freeform Cartesian+前後・左右の2パラメータ)。斜めはブレンドが補間してくれる。
  • SetFloatにはdampTime。入力の急変化を滑らかな加減速に変える。
  • 部位別アニメはLayers+Avatar Mask。下半身は移動、上半身はアクション。
  • Root Motionは主導権スイッチ。「移動量を決めるのはモーションかロジックか」で決める。

まずは2D Blend Treeでの8方向移動から。1つ組んでみると、市販ゲームのキャラの動きが「どう作られているか」で見えるようになります。