概要
キャラクターが歩いたり、ジャンプしたり、攻撃したりといった動きは、ゲームに生命感を与える上で不可欠な要素です。Unityでは、これらの2Dアニメーションを比較的簡単に作成し、管理するための強力なシステムが提供されています。
Unityの2Dアニメーションシステムは、主に以下の3つの要素で構成されています。
- Animationウィンドウ: スプライトをタイムラインに並べて、アニメーションの「コマ撮りフィルム」であるアニメーションクリップ (Animation Clip) を作成する場所。
- Animatorコンポーネント: ゲームオブジェクトにアタッチされ、どのアニメーションを再生するかを制御するコンポーネント。
- Animatorコントローラー (Animator Controller): アニメーションクリップ間の遷移(例: 「待機」状態から「歩き」状態へ)のルールを定義するステートマシン(状態遷移図)。
この記事では、スプライトシートからアニメーションクリップを作成し、Animatorコントローラーでキャラクターの状態に応じて再生を切り替える基本的な流れを解説します。
Step 1: アニメーションクリップの作成
まず、キャラクターの個々のアクション(待機、歩き、ジャンプなど)に対応するアニメーションクリップを作成します。
-
準備: アニメーションさせたいゲームオブジェクト(
Sprite Rendererコンポーネントを持つ)をシーンに配置します。また、使用するスプライトは、スプライトシートから分割済みであるとします。 -
Animationウィンドウを開く: アニメーションさせたいオブジェクトを選択した状態で、メニューから
Window > Animation > Animationを選択してAnimationウィンドウを開きます。 -
最初のクリップを作成: ウィンドウに「To begin animating [オブジェクト名], create an Animator and an Animation Clip.」と表示されるので、
Createボタンを押します。これにより、以下の2つが自動的に作成 されます。- Animatorコントローラー: アニメーションの状態を管理するアセット(
.controllerファイル)。 - アニメーションクリップ: 最初のクリップ(
.animファイル)。ファイル名を「Idle」(待機)などと付けて保存します。 - 同時に、オブジェクトには
Animatorコンポーネントがアタッチされ、作成したAnimatorコントローラーがセットされます。
- Animatorコントローラー: アニメーションの状態を管理するアセット(
-
スプライトを登録: プロジェクトウィンドウから、待機アニメーションに使用する分割済みスプライトをすべて選択し、Animationウィンドウのタイムライン上にドラッグ&ドロップします。すると、タイムライン上にキーフレームが自動的に打たれ、スプライトが順番に登録されます。
-
再生して確認: Animationウィンドウの再生ボタンを押すと、シーンビュー上でアニメーションが再生されます。速すぎる場合は、タイムライン上のキーフレームをドラッグして間隔を調整します。
-
他のクリップを作成: 同様に、Animationウィンドウのクリップ名が表示されている部分(「Idle」など)をクリックし、
Create New Clip...を選択して、「Walk」や「Jump」といった他のアニメーションクリップも作成・保存し、対応するスプライトを登録していきます。
Step 2: Animatorコントローラーで状態を管理する
アニメーションクリッ プが準備できたら、次はAnimatorコントローラーを使って、どのタイミングでどのアニメーションを再生するかを定義します。
-
Animatorウィンドウを開く: プロジェクトウィンドウで作成したAnimatorコントローラーアセットをダブルクリックするか、メニューから
Window > Animation > Animatorを選択してAnimatorウィンドウを開きます。 -
ステートの確認: ウィンドウには、作成したアニメーションクリップに対応する「ステート」(色の付いた箱)が配置されています。
Entry(開始点)から矢印が伸びているステートが、デフォルトで再生されるアニメーションです(通常は最初に作成した「Idle」)。 -
パラメータの作成: アニメーションの状態をスクリプトから制御するために、パラメータを作成します。Animatorウィンドウの左上にある
Parametersタブを開き、+ボタンからパラメータを追加します。Float: 速度など、連続的な値。Int: 武器の種類など、整数値。Bool: ジャンプ中かどうかなど、true/falseの状態。Trigger: 攻撃やダメージなど、一度だけ発生するイベント。
ここでは例として、
Float型のSpeedパラメータと、Bool型のIsJumpingパラメータを作成します。 -
トランジション(遷移)の作成: ステート間でアニメーションを切り替えるための「矢印」であるトランジションを作成します。
- 「Idle」ステートを右クリックし、
Make Transitionを選択して、「Walk」ステートまで矢印を伸ばしてクリックします。これで「Idle」→「Walk」の遷移が作成されます。 - 逆方向の「Walk」→「Idle」のトランジションも同様に作成します。
- 「Idle」ステートを右クリックし、
-
トランジションの条件設定: 作成したトランジション(矢印)を選択し、Inspectorで遷移が発生する条件を設定します。
- 「Idle」→「Walk」:
Conditionsリストで、SpeedGreater0.1(速度が0.1より大きい)と設定します。 - 「Walk」→「Idle」:
Conditionsリストで、SpeedLess0.1(速度が0.1より小さい)と設定します。 - また、
Has Exit Timeのチェックは外しておきましょう。これをオンにすると、現在のアニメーションが再生し終わるまで次の状態に遷移しなくなり、レスポンスが悪くなります。
- 「Idle」→「Walk」:
Step 3: スクリプトからAnimatorを制御する
最後に、プレイヤーの入力や状態に応じて、スクリプトからAnimatorのパラメータを更新します。
using UnityEngine;
[RequireComponent(typeof(Animator))]
public class PlayerAnimationController : MonoBehaviour
{
private Animator animator;
private Rigidbody2D rb;
void Start()
{
animator = GetComponent<Animator>();
rb = GetComponent<Rigidbody2D>(); // 速度を取得するためにRigidbody2Dが必要
}
void Update()
{
// 水平方向の速度の絶対値を取得し、Animatorの"Speed"パラメータにセット
float speed = Mathf.Abs(rb.velocity.x);
animator.SetFloat("Speed", speed);
// 例:ジャンプボタンが押されたら"IsJumping"パラメータをtrueにする
if (Input.GetButtonDown("Jump"))
{
animator.SetBool("IsJumping", true);
}
}
}
animator.SetFloat(), animator.SetBool(), animator.SetTrigger()といったメソッドを使ってパラメータを更新することで、Animatorコントローラーが自動的に条件を判断し、適切なアニメーションステートに遷移してくれます。
まとめ
Unityの2Dアニメーションシステムは、一見複雑に見えますが、各要素の役割を理解すれば非常にシステマチックに作られています。
- Animationウィンドウで、スプライトを並べてアニメーションクリップ(
.anim)を作成する。 - Animatorコントローラー(
.controller)で、クリップ間の遷移(トランジション)と、その条件を定義する。 - 遷移の条件としてパラメータ(Float, Boolなど)を作成する。
- スクリプトからAnimatorコンポーネントの参照を取得し、
SetFloatやSetBoolでパラメータを更新してアニメーションを制御する。
この流れをマスターすれば、キャラクターの様々なアクションを生き生きと表現できるようになります。