はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】Animation内からメソッドを呼ぶ方法(Animation Event)

はじめに

今回はAnimationからメソッドを呼ぶ方法についての記事になります!

Unityに標準で備わっている馴染み深いアニメーションですが、Animation Eventという機能があることをご存じでしょうか。

かく言う私も最近知ったのですが、どうやらAnimation Eventを用いることでAnimation内から対象のゲームオブジェクトにアタッチされたスクリプトのメソッドを呼ぶことができるみたいです。

というわけで詳しくみていきましょう!

Animation Eventとは

Unityの公式リファレンスにはこのように書かれていました。

アニメーションイベントは、オブジェクトのスクリプト内の関数をタイムラインの特定のタイミングで呼び出すことができます。

アニメーションイベントの使用 - Unity マニュアル

これでアニメーションに合わせたメソッドの実行が可能になります。

使ってみる

サンプルとしてこのようなAnimationを用意してみました。

f:id:hanaaaaaachiru:20190513180510p:plain

ここにAnimation Eventを追加するには、下の画像のような イベントボタン をクリックします
ただし、現在の再生位置に登録されることに注意してください。(白いラインがある時間)

f:id:hanaaaaaachiru:20190513204308p:plain

f:id:hanaaaaaachiru:20190513204417p:plain

作成したAnimation Eventを選択した状態ではインスペクター上でこのように表示されているはずです。

f:id:hanaaaaaachiru:20190513204657p:plain

このFunctionに実行したいメソッドを選ぶことで決まったタイミングでメソッドを呼ぶことができるようになります

ただし、Animationコンポーネントがアタッチされているゲームオブジェクトにアタッチされたスクリプトのメソッドしか呼び出せないことに注意しましょう。

サンプルとしてこのようなスクリプトを用意してみました。これをAnimationコンポーネントがアタッチされているゲームオブジェクトにアタッチします。

Sample.cs
using UnityEngine;

public class Sample : MonoBehaviour
{
    private void PrivateMethod()
    {
        Debug.Log("PrivateMethod");
    }

    public void PublicMethod()
    {
        Debug.Log("PublicMethod");
    }
}

そしてもう一度Animation Eventを選択してみると先程のメソッドがあるはずです。
また自分で作成したメソッドは一番下に表示されていたので、左下の矢印から一番下まで移動する必要がありました。

f:id:hanaaaaaachiru:20190513205942p:plain

PrivateMethodPrivateMethodの両方が表示されていたので、privatepublicのメソッドも実行できるようです。

パラメータを付ける

これらのメソッドには一つまで引数をつけることができます。

公式のリファレンスにもこのように表記されていました。

関数はアニメーションイベントにより呼び出され、オプションとしてパラメーターをひとつ付加することができます。パラメーターは float、string、int、オブジェクト 参照、あるいは AnimationEvent オブジェクトです。AnimationEvent オブジェクトはメンバー変数を持ち、float、string、int、オブジェクト参照をすべて一緒に、関数呼び出しをトリガーしたイベントに関する情報とともに、関数に受け渡すことができます。

アニメーションイベントの使用 - Unity マニュアル

AnimationEventオブジェクトも引数として選べるのは結構面白いですが、多くの場合はint,float,stringではないでしょうか。

今回はサンプルとしてstringで試してみたいと思います。

using UnityEngine;

public class Sample : MonoBehaviour
{
    public void SampleMethod(string str)
    {
        Debug.Log("str: " + str);
    }
}

f:id:hanaaaaaachiru:20190513210954p:plain

f:id:hanaaaaaachiru:20190513211028p:plain

さいごに

タイミングを実際に視覚的に見ながら設定するのは結構便利ですね。
ただAnimationEventのメソッドを登録するときに、自作のメソッドが一番下にあるのはやや移動が面倒な気がしました。。。