こんにちは、ともくんのゲーム作り部屋にようこそ!
このページでは、
「Unityのアニメーションイベントってなに?」
「アニメーションの途中で処理を行いたい!」
というお悩みの方に向けた内容となっています。
Unityでは、キャラクターやエフェクト、カメラなど様々なものにアニメーションの動きを付けることができます。
このアニメーションの再生中の任意のタイミングで、ゲーム内の処理を実行できるのがアニメーションイベント(AnimationEvent)というものになります。
例えば、アニメーションイベントを使うことで、アニメーションの再生が終了したタイミングで関数を呼び出して何かしらの処理を行う、ということができます。
そこでこのページでは、Unityのアニメーションイベントについて、どういうものなのか、仕組みや使い方までをまとめていきます。
アニメーションイベント(AnimationEvent)とは?
アニメーションイベント(AnimationEvent)は、アニメーションが再生されている際の特定のタイミングで、指定した関数を呼び出して処理を行うことができる機能です。
もう少し簡単に言えば、アニメーションの動きに合わせてゲーム内で様々な処理を行うことができるのが、アニメーションイベントの機能となっています。
例えば、キャラクターが攻撃を受けて画面内から消えるまでの動きをアニメーションで作る場合、アニメーションの再生が終わる最後のタイミングにアニメーションイベントを設定して、キャラクターを消す処理の関数を呼び出すことで、アニメーションの動きが終わったら消去するという処理を作ることができるようになります。

他にも、アニメーションイベントを使うことで、アニメーションの再生途中で音を流したり、アニメーションの再生に合わせてプレイヤーを移動させたり、アニメーションのループ回数を計測するなどの処理を行うことができます。
アニメーションイベント(AnimationEvent)の使い方・作り方
ここからは、実際にUnity上でアニメーションイベントの使い方や作り方を紹介していきます。
例として、以下の丸いオブジェクトに対してアニメーションで移動する動きを作り、アニメーションイベントでアニメーションがループ再生された回数を計測していく処理を作ってみます。

アニメーションの作成
まずは、アニメーションの作成を行っていきます。
オブジェクトを選択した状態で、メニューの「Window」から「Animation」の中の「Animation」を選択します。

そして、開いたAnimationウィンドウの真ん中の「Create」から、Animation Clipを作成します。

そして、Animationウィンドウの左側の「Add Property」を選択して、「Transform」の中にある「Position」を+ボタンで追加します。

あとは、タイムライン上にキーフレームでオブジェクトの座標位置を設定していきます。

ここでは、以下のようにオブジェクトがグルグルと回るような簡単な動きを付けてみました。

なお、アニメーションの作成については、以下の記事でも詳しく解説していますので、参考にしてみてください。
スクリプトで呼び出すメソッドを作成する
次に、アニメーションイベントを使ってゲーム内で処理を行いたいメソッドを作成していきます。
まず、オブジェクトに対して、以下のスクリプトをアタッチしておきます。
using UnityEngine;
public class CircleController : MonoBehaviour
{
public int loopCount;
// 呼び出したいメソッド
public void AnimationCount()
{
loopCount++;
}
}
8行目でAnimationCountというメソッドを作り、中で数字が計測される処理を作っています。
この呼び出したいメソッドを作る際は、頭にpublic修飾子を付けておく必要があります。
また、アニメーションイベントを使って呼び出したいメソッドを書いたスクリプトは、Animatorコンポーネントと同じ階層に紐づけておく必要があるので、注意しておきましょう。

そして今回は、画面内でアニメーションの再生回数を計測してUIとして表示させたいので、TextMeshProを使って回数を表示できる処理を作っています。

TextMeshProのオブジェクトには、以下のスクリプトをアタッチしておきます。
using TMPro;
using UnityEngine;
public class CountDisplay : MonoBehaviour
{
public GameObject circle;
TextMeshProUGUI textMesh;
CircleController circleController;
int count; // カウント数の変数
void Start()
{
textMesh = GetComponent<TextMeshProUGUI>();
circleController = circle.GetComponent<CircleController>();
}
void Update()
{
// カウント数が変化した場合
if (circleController.loopCount != count)
{
count = circleController.loopCount;
textMesh.text = count.ToString(); // カウント数をUIに表示させる
}
}
}
19~24行目でアニメーションの再生回数の値が変動したら、TextMeshProのテキスト内容を変更するという処理を作っています。
AnimationEventをAnimation Clip内に設定する
ここまでできたら、アニメーションイベントをAnimation Clip内に設定していきます。
Animationウィンドウを開いて、タイムライン上でアニメーションイベントを設定したい場所を選択して、左側の「Add event」を選択します。

ここでは、アニメーションの最後のタイミングでアニメーションイベントを設定しています。
そして、この追加したEventを選択した状態で、インスペクターウィンドウからFunctionの項目を選択して、「CircleController」の「Methods」の中に先ほど作成した「AnimationCount()」があるので選択します。

これで、アニメーションが再生されて、アニメーションイベントを設定したタイミングまできたら、指定したメソッドの処理が行われることになります。
実際にゲームを実行してみると、

オブジェクトがアニメーションでループで動いていますが、1周する度にカウント回数が増えていて、アニメーションイベントが行われているのが分かります。
まとめ
このページでは、Unityで設定できるアニメーションイベントについて、どんな仕組みなのか、また使い方や作り方までをまとめていきましたが、いかがでしたでしょうか?
アニメーションイベントとは、アニメーションの動きに合わせて処理を行うことができる機能で、アニメーションの特定のタイミングで関数を呼び出すことができます。
アニメーションイベントを設定する際は、Animatorコンポーネントと同じ階層にメソッドを記述したスクリプトを紐づけて、Animation Clip内で設定していきます。
アニメーションの再生が終わったタイミングで処理を実行したり、アニメーションの動きに合わせて音を流したいなどの際に、アニメーションイベントが活用できます。
最後までお読みいただきまして、ありがとうございました!
コメント