アニメーションを付けよう:AnimationとAnimator【Unityスタートガイド12-2】

キャラクターが歩く、宝箱がパカッと開く、ボタンがふわっと大きくなる。動きがあるだけでゲームはぐっと楽しくなります!今回はUnityのアニメーションの基本、Animationウィンドウでの動きの作り方と、Animatorでの切り替え方をご紹介します。

目次

この記事で学べること

  • Animationウィンドウでアニメーション(クリップ)を作る方法
  • 2Dのスプライトを並べて、パラパラ漫画のアニメーションを作る方法
  • Animatorで、アニメーションを切り替える仕組み(状態・遷移・パラメータ)
  • スクリプトからアニメーションを切り替える方法

前提知識

4-5の記事では「アニメーションクリップを作ってキーフレームを打つ」ところまでを紹介しました。この記事では、その続きとしてAnimatorでの切り替えまで説明します。

アニメーションの仕組み

Unityのアニメーションは、次の3つで動きます。

  • Animation Clip(アニメーションクリップ):1つの動き(歩く、ジャンプ、開くなど)のデータ
  • Animator Controller:どのクリップを、どんなときに再生するかを決める設計図
  • Animatorコンポーネント:オブジェクトに付けて、Animator Controllerを動かす

Animationウィンドウで動きを作る

クリップを作る

  1. 動かしたいオブジェクトを選択(例:Cube)
  2. Window>Animation>Animationを開く
  3. AnimationウィンドウのCreateボタンを押す
  4. 保存先とファイル名(例:CubeBounce)を決めて保存

これで、クリップと一緒にAnimator Controllerが作られ、オブジェクトにAnimatorコンポーネントが自動で付きます。

キーフレームを打つ

キーフレームは「この時間に、この値」という目印です。間はUnityが自動でなめらかにつないでくれます。

  1. Animationウィンドウ左上の録画ボタン(赤い丸)を押す
  2. タイムラインの0:00を選んで、CubeのPositionをY:0にする
  3. タイムラインの0:30(0.5秒)を選んで、Position Yを1にする
  4. タイムラインの1:00(1秒)を選んで、Position Yを0に戻す
  5. もう一度録画ボタンを押して終了

録画中はInspectorの値を変えるだけでキーフレームが打たれます。左側のAdd Propertyから、動かしたい項目(Transform>Positionなど)を先に追加する方法もあります。

再生ボタン(▶)で、Cubeがぴょんぴょん跳ねれば成功!

ループの設定

ProjectウィンドウでAnimation Clip(CubeBounce)を選ぶと、Inspectorに設定が出ます。

  • Loop Time:チェックすると、最後まで再生したら最初に戻ってくり返す

歩く・待機のように続ける動きはチェック、ジャンプや扉が開くように1回で終わる動きはチェックを外します。

スライム

録画ボタンを押したまま、ほかのオブジェクトを動かしちゃってた・・・

フェアリー

録画中はInspectorの変更が全部記録されちゃうよ!作業が終わったら、録画ボタンを押して止めるのを忘れずにね

2Dのスプライトアニメーション

2Dのキャラクターは、少しずつ違う絵を順番に切り替えて動かします(パラパラ漫画と同じです)。

  1. 4-4の記事の方法で、キャラクターの画像をSprite Editorで1コマずつに切り分けておく
  2. Projectウィンドウで、1つの動き(歩きなど)のスプライトを、Shiftを押しながら全部選択
  3. 選んだスプライトを、Hierarchyにドラッグ&ドロップ
  4. 保存先とファイル名(例:PlayerWalk)を聞かれるので保存

これで、スプライトを表示するオブジェクトと、アニメーションクリップ、Animator Controllerがまとめて作られます。

速さの調整

Animationウィンドウ右上の「⋮」からShow Sample Rateを選ぶと、Samples(1秒間に何コマ進めるか)が表示されます。

  • 数字を大きくすると速く、小さくするとゆっくりになる
  • ドット絵の歩きなら、8〜12ぐらいから試してみましょう

Animatorでアニメーションを切り替える

「止まっているときは待機、動いたら歩き」のように、状況に合わせてクリップを切り替えるのがAnimatorです。

Animatorウィンドウを開く

  • Window>Animation>Animatorを開く
  • アニメーションの付いたオブジェクトを選ぶと、その設計図が表示される

状態(State)

四角い箱1つ1つが状態で、それぞれにクリップが入っています。

  • オレンジ色の状態:最初に再生される状態(右クリック>Set as Layer Default Stateで変更)
  • 新しいクリップは、ProjectウィンドウからAnimatorウィンドウにドラッグ&ドロップで追加出来ます

遷移(Transition)

状態から状態への矢印が遷移です。

  • 状態を右クリック>Make Transitionで、つなぎたい状態をクリック
  • 矢印を選ぶと、Inspectorに切り替えの条件が表示される

パラメータ(Parameters)

切り替えの条件に使う変数です。Animatorウィンドウ左上のParametersタブの「+」から追加します。

型使いどころ
Bool歩いている/いない、のように続く状態
Triggerジャンプ、攻撃のように1回だけ起こること
Float移動の速さ(数字で切り替える)
Int武器の種類など、番号で切り替える

例:待機と歩きを切り替える

  1. ParametersにBoolで「IsWalking」を追加
  2. Idle → Walkの遷移を作り、InspectorのConditionsの「+」で「IsWalking」「true」を設定
  3. Walk → Idleの遷移を作り、Conditionsに「IsWalking」「false」を設定
  4. どちらの遷移も、下の設定にする
    • Has Exit Time:チェックを外す(条件を満たしたらすぐ切り替える)
    • Transition Duration:0(2Dのスプライトアニメなら、なめらかにつながなくてよいので0にする)

Has Exit Timeとは

  • チェックあり:今のアニメーションが最後(決まった時間)まで再生されてから切り替わる
  • チェックなし:条件を満たした瞬間に切り替わる

ボタンを押した瞬間に反応してほしい動きは、チェックを外すのが基本です。

スクリプトから切り替える

Animatorのパラメータを、スクリプトから変えます。

using UnityEngine;

public class PlayerAnimatorControl : MonoBehaviour
{
    [SerializeField] private Animator animator;

    // パラメータ名を数字(ハッシュ)にしておくと、少し速く、つづり間違いも見つけやすい
    private static readonly int IsWalkingHash = Animator.StringToHash("IsWalking");
    private static readonly int JumpHash = Animator.StringToHash("Jump");

    private InputSystem_Actions inputActions;

    void Awake()
    {
        inputActions = new InputSystem_Actions();
    }

    void OnEnable()
    {
        inputActions.Enable();
    }

    void OnDisable()
    {
        inputActions.Disable();
    }

    void Update()
    {
        // 移動の入力があれば歩き、なければ待機
        Vector2 move = inputActions.Player.Move.ReadValue<Vector2>();
        animator.SetBool(IsWalkingHash, move != Vector2.zero);

        // ジャンプのボタンでTriggerを送る
        if (inputActions.Player.Jump.WasPressedThisFrame())
        {
            animator.SetTrigger(JumpHash);
        }
    }
}
  • InspectorのAnimator欄に、アニメーションを付けたオブジェクトのAnimatorをセットします
  • animator.SetBool("IsWalking", true)のように、文字列のまま書いてもOKです
  • Triggerを使う場合は、Animatorで「Jump」というTriggerのパラメータを作り、Any StateなどからJumpの状態への遷移の条件にします
  • 移動そのものは、6-8のPlayerMoverと一緒に使います
書き方パラメータの型
animator.SetBool(名前, true)Bool
animator.SetTrigger(名前)Trigger
animator.SetFloat(名前, 1.5f)Float
animator.SetInteger(名前, 2)Int

3Dの人型キャラクターの場合

3Dの人型キャラクターは、Mixamoなどのアニメーションを使うのが便利です。Humanoidの設定やBlend Treeを使った歩き・走りの切り替えは、Mixamoのアニメーションで歩く・走るキャラクターを作ろうで紹介しています。

よくあるエラーと対処法

エラー:アニメーションが再生されない

  • 原因:オブジェクトにAnimatorが付いていない、AnimatorのControllerが空、または最初の状態(オレンジ)にクリップが入っていない
  • 対処法:AnimatorコンポーネントのControllerと、Animatorウィンドウのオレンジの状態を確認する

警告:Parameter ‘IsWalking’ does not exist.

  • 原因:スクリプトで指定したパラメータ名が、Animatorにない(つづり・大文字小文字の違い)
  • 対処法:AnimatorウィンドウのParametersと、スクリプトの名前を完全に同じにする

エラー:切り替わるのが遅い

  • 原因:遷移のHas Exit Timeにチェックが入っていて、アニメーションの最後まで待っている
  • 対処法:Has Exit Timeのチェックを外す。Transition Durationも短くする

エラー:1回だけの動きがくり返される

  • 原因:クリップのLoop Timeにチェックが入っている
  • 対処法:ProjectウィンドウでクリップのLoop Timeのチェックを外す

エラー:動かしたいのに位置が変わらない(アニメーションに固定される)

  • 原因:アニメーションでPositionを動かしていると、スクリプトで動かした位置が上書きされる
  • 対処法:アニメーションを付けるのは見た目用の子オブジェクトにして、移動は親オブジェクトで行う

まとめ

  • Animationウィンドウ:Createでクリップを作り、録画ボタンでキーフレームを打つ
  • 2Dのスプライトアニメ:スプライトをまとめてHierarchyにドラッグ、速さはSamples
  • Animator:状態・遷移・パラメータでクリップを切り替える
  • Has Exit Time:すぐ切り替えたいときはチェックを外す
  • スクリプト:SetBool / SetTrigger / SetFloatでパラメータを変える

次のステップ

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次