こんにちは、Unityエンジニアのオオバです。
AnimatinClip再生中に何か処理を実行させたくなることってありませんか?例えば剣を振るアニメーション中にエフェクトを再生したいとか。
そんなときはAnimationEventを使うと実現可能です。
AnimationEventとはAnimationClip内に任意のタイミングで仕込めるイベントのこと。便利な仕組みなのでぜひ覚えておきましょう。
👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!
AnimationEventとは
そもそもAnimationEventとは何かというと 任意のアニメーションタイミングで処理を実行できる仕組み です。具体的にはAnimationClip内にイベントデータを埋め込みます。
詳しくは後述しますが、Animationウィンドウから指定のAnimationClipに対してイベントを設定可能です。1つのAnimationClipに対して何個でも登録できます。
AnimationEventを使うための2つの準備
AnimationEventには次の2つの要素を準備します。
- AnimationClip
- レシーバーコンポーネント
準備1.AnimationClip
まず最初に必要な準備物は AnimationClip です。AnimationEventはAnimationClip内に格納するデータなのでAnimationClipがなくては話になりません。
またAnimationClipの設定は特に指定はありません。ループアニメーションでも問題なくAnimationEventは実行できます。
準備2.レシーバーコンポーネント
次にレシーバーコンポーネントです。レシーバーコンポーネントとはAnimationEventが実行したときの 受け皿 です。
AnimiationEventの目的は 任意のタイミングで任意の関数を実行すること 。任意の関数を宣言する場所が必要ということです。その関数を宣言する場所がレシーバーコンポーネントになります。
ちなみに呼び出す関数は「public」である必要があるので注意してください。
AnimationEventのレシーバーコンポーネントはAnimatorと同階層
レシーバーコンポーネントは配置箇所が重要です。AnimationClipからイベントを受け取るためにはAnimatorと同階層である必要があります。
上図のようにAnimatorとAnimationEventのレシーバーは同階層にAddComponentしておいてください。
次のサンプルコードはレシーバーコンポーネントの例です。Hogeというpublicメソッドだけを宣言したシンプルなコンポーネントです。
using UnityEngine;
public class AnimationEvent : MonoBehaviour
{
public void Hoge()=> Debug.Log("Hoge");
}
先の解説の通りAnimatorと同階層にセットしておきましょう。
AnimationEventの設定
次にAnimationウィンドウからAnimationEventを設定していきます。Hierarchyウィンドウから AnimatorのついたGameObjectを選択状態 にしてAnimationウィンドウを操作します。
上の動画のように任意のタイミングで 右クリック-> Add Animation Event
でAnimationEventを追加できます。
追加しただけでは動きません。レシーバーコンポーネントで宣言した任意のメソッドを指定します。
追加したAnimationEventを選択肢てInspectorウィンドウから実行したいメソッドを選択します。
するとAnimationClip再生時に指定したC#の関数が実行されます。キャラクターのアニメーションに連動したプログラム、エフェクトに合わせた処理などが作れるようになるため ゲームを作る上で知らないと損する機能 だと思っています。
パラメータを使ってAnimationEventを使いこなす
AnimatioinEventを使ってシンプルな関数を呼び出せるようになったと思います。任意のアニメーションタイミングで任意の関数を呼べるようになりましたね。
ここからは パラメータを使ったより高度なAnimationEventの活用法 について解説していきます。
前章のサンプルではHogeメソッドをただ呼び出すだけの単純な処理でしたが、実はAnimationEventにはパラメータを渡すことができるのです。
パラメータ付きAnimatioonEventとは?
パラメータ付きAnimationEventとは、一言で言えば引数付き関数を実行できるということです。
public void Hoge(int id)
{
//〜〜〜〜〜 処理 〜〜〜〜〜
}
具体的には上記のように引数付き関数をAnimationEventから呼び出せるということ。つまり、パラメータを活用することでプログラムを使い回すことができるということです。
AnimationEventを使うときには必須知識になるのでぜひマスターしてしまいましょう。
パラメータ付きAnimationEventの制限
パラメータ付きAnimationEventの制限には2ついくつか制限があります。
①使用可能な型の種類
②同時に使えるパラメータ数
1.AnimationEventで使用可能な型の種類
1つ目の制限はAnimationEventで使用できる型の種類です。AnimationEventで使えるパラメータの種類は次の5つになります。
- float型
- int型
- string型
- Enum型
- UnityEngine.Object型
- GameObject型
- コンポーネント
- ScriptableObject
「パラメータなし」も含めれば合計6種類の関数をAnimationEventは取り扱うことができるということになります。
2.AnimationEventで同時に渡すパラメータ数
2つ目の制限は同時に使用できるパラメータの数です。パラメータ付きAnimationEventは型の種類以外にもパラメータの数も制限が発生します。
それはAnimationEventで渡せるパラメータ(引数)の数は1個までだということです。 第1引数までの関数しかAnimationEventは認識しない ことに注意してください。
// ◯(AnimationEventとして認識される)
public void Hoge(int id)=>Debug.Log(id);
// ×(AnimationEventとして認識されない)
public void Foo(int id, string name)=>Debug.Log(${id}, {name});
上記Foo関数は 引数が2つ あるためAnimationEvent側から関数登録できません。
実際にAnimationEventを設定してみよう
AnimationEventの制限について解説してきましたが、実際にAnimationEventを設定して確認してみましょう。次のソースコードはAnimationEventの全パターンを網羅したレシーバーコンポーネントです。
Animatorと同階層にセットしてAnimationウィンドウからAnimationEventを設定してみましょう。
するとどうなったでしょうか。
上図のように8種類がリストアップされました。この内GameObjectとBoxCollider、ScriptableObjectはUnityEngine.Object型であるため厳密には8種類ではなく 5種類 ということを覚えておきましょう。
また一度に複数のデータを渡したい場合は ScriptableObject を指定するのがオススメです。
AnimationEventは制限も多いですが、便利な仕組みなのでぜひ覚えておきましょう。
設定したAnimationEventを調べる方法
AnimationEventの設定数が増えてくると、プログラム側から確認したくなることがあります。そんなときにどうやってAnimationClipからイベントを調べたら良いでしょうか。
結論から言うと、次のコードで取得可能です。
[SerializeField] private AnimationClip _clip;
void Awake()
{
AnimationEvent[] events = _clip.events;
}
AnimationClipの events
プロパティからAnimationEvent型の配列を受け取ることができます。
プログラムからAnimationEventを調べたいときに重宝するので覚えておきましょう。
AnimationEventまとめ
本記事ではAnimationEventについて解説してきました。簡単に記事の内容をまとめます。
①任意のタイミングで関数を呼び出す仕組み
②レシーバーコンポーネントが必要
③Animatorと同階層にレシーバーコンポーネント
④5種類の引数を指定可能
またAnimationEventに使用できるパラメータの種類は次の5種類でした。
- float型
- int型
- string型
- Enum型
- UnityEngine.Object型
引数なしも含めれば、AnimationEventの引数は合計6種類ということです。
AnimationEventは任意のタイミングで関数を呼べる便利機能です。イベント登録自体はプログラムなしで実装できるため、分業も可能。
ぜひゲーム開発中の開発ワークフローのアイデアの1つとして覚えておきましょう。

筆者のXをフォローしよう
- Unity6000.0.32f1