見出し画像

【Unity初心者向け】Animator基礎編⑤|Animation Eventでアニメーションから処理を呼び出す

Animator基礎編も、今回でいよいよ最終回です。

これまでの記事では、

  • Animatorの基本的な仕組み

  • Parameter

  • Trigger

  • Any State

  • Transition

  • Has Exit Time

  • Transition Duration

など、Animator Controller側の機能を中心に確認してきました。
今回は少し方向を変えて、AnimationからC#の処理を呼び出す方法を確認していきます。

使用するのは、Animation Eventという機能です。
Animation Eventを使うと、

  • 剣を振り下ろした瞬間に攻撃判定を行う

  • 足が地面についた瞬間に足音を鳴らす

  • 魔法を放つ瞬間にエフェクトを表示する

といったように、アニメーションの動きに合わせて処理を実行する ことができるようになります。

Animator 基礎編【全5回】

  1. Animatorとは? ― IdleとWalkを切り替える

  2. Parameterの使い方 ― Bool / Float / Int / Trigger

  3. TriggerとAny State ― 攻撃アニメーションを作る

  4. Transitionを理解する ― Has Exit Time / Duration

  5. Animation Event ― アニメーションから処理を呼び出す

今回は、第3回で作成したAttackアニメーションを利用しながら、Animation Eventの基本的な使い方を確認していきましょう。



Animation Eventとは?

まずは、Animation Eventがどのような機能なのか確認してみましょう。

例えば、プレイヤーが剣で攻撃するゲームを考えてみます。
スペースキーを押すと、

animator.SetTrigger("Attack");

が実行され、Attackアニメーションが再生されます。
ここまでは、これまでの記事でも確認してきました。
しかし、実際の攻撃アニメーションでは、

  1. 剣を構える

  2. 剣を振り始める

  3. 剣が敵に当たる

  4. 剣を振り切る

  5. 元の姿勢に戻る

というように、いくつかの動きがあります。
ここで問題になるのが、「どのタイミングで攻撃処理を実行するのか」という点です。

スペースキーを押した瞬間に攻撃判定を行ってしまうと、まだ剣を振っていないのに敵へダメージを与えてしまいます。
できれば、剣が敵へ当たる瞬間に処理を実行したいところです。

そこで使用できるのが、Animation Event です。

Animation Event を使うと、Animation Clip の好きな位置にイベントを設定し、そのタイミングでC#の関数を呼び出すことができます。


Attackアニメーションを確認

今回は、第3回で作成したAttackアニメーションを利用します。

Animator Controllerは、次のような構成になっています。

Attackへ移動するTransitionには、
Condition:Attack
というTrigger Parameter を設定しています。

スクリプト側では、例えば次のような処理を書いていました。

if (Input.GetKeyDown(KeyCode.Space))
{
    animator.SetTrigger("Attack");
}

スペースキーを押すと、SetTrigger("Attack") が実行されます。
Animator は Attack Trigger を受け取ると、
Any State → Attack
のTransitionを使ってAttackへ移動します。
その結果、Attackアニメーションが再生されます。

ここまでの処理は、すでに学習済みの C# から Animator へ命令を送るという流れです。

今回はここからさらに、Animation から C# へ処理を返す仕組みを追加していきます。


Animation Eventを追加

AnimationClipの展開

それでは、Animation Eventを追加してみましょう。

Hierarchy から、Animator が設定されている Player を選択します。
次に、Unity上部メニューから、
Window → Animation → Animation
を選択します。(もしくは Controlキー + 6)

Animationウィンドウが表示されます。

Animation Clipの選択欄から、「Attack」を選択します。
Attackアニメーションのタイムラインが表示されます。

ここで、再生ボタンを押してアニメーションを確認してみましょう。

今回Animation Eventを設定したいのは、剣が敵へ当たりそうなタイミング です。
Animationウィンドウの再生位置を、そのタイミングへ移動します。


Animation Eventを追加

剣が敵へ当たりそうな位置へ再生位置を合わせたら、Animation Eventを追加します。

Animationウィンドウ上部にある「Add Event」をクリックします。
すると、タイムライン上に小さなEventマーカーが追加されます。
このマーカーが、処理を実行するタイミングになります。

Eventマーカーは後から左右へ移動できます。
つまり「少し早い」や「少し遅い」と感じた場合でも、コードを書き換える必要はありません。

Animation Eventの位置を動かすだけで、実行タイミングを変更できます。
これはAnimation Eventの大きなメリットのひとつです。


C#側に呼び出される関数を作成

Animation Eventを追加しただけでは、まだ何も起こりません。
次は、C#側に Animation Eventから呼び出す関数を作ります。

Playerを操作しているスクリプト(PlayerAnimatorController)へ、次の関数を追加してみましょう。

public void AttackHit()
{
    Debug.Log("攻撃が当たるタイミング!");
}

今回は、いったん動きを確認するために、Debub.Log()でConsoleに文字を表示してみたいと思います。
スクリプト全体は、例えば次のようになります。

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    Animator animator;

    void Start()
    {
        animator = GetComponent<Animator>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            animator.SetTrigger("Attack");
        }
    }

    public void AttackHit()
    {
        Debug.Log("攻撃が当たるタイミング!");
    }
}

Animation Eventから関数を指定

Unityへ戻って、Animationウィンドウで先ほど追加したEventマーカーをクリックします。

Eventを選択すると、Inspector などに Functionを指定する項目が表示されます。
ここから、AttackHit を選択、または直接入力します。

これで、Animation EventとC#のAttackHit関数が接続されました。
ゲームを実行して、スペースキーを押してみましょう。

Attackアニメーションが再生されます。
そして、Animation Eventを設定したタイミングになると、
「攻撃が当たるタイミング!」とConsoleへ表示されます。

これで、AnimationからC#の処理を呼び出すことができました。


Eventの位置を変更してみよう

Animation Eventの便利なところは、処理を実行するタイミングをAnimationウィンドウから調整できることです。

例えば、攻撃処理が少し早すぎたとします。
その場合、

AttackHit()

のコードを書き換える必要はありません。
Animationウィンドウを開いて、Eventマーカーを少し右へ移動します。
反対に処理が遅すぎる場合は、Eventマーカーを左へ移動します。
このように、アニメーションを見ながら処理のタイミングを調整できます。

攻撃モーションの場合、剣やパンチが実際に敵へ当たる位置に合わせてEventを配置すると自然です。

今回はDebug.Logを使いましたが、Animation Eventから呼び出す処理はDebug.Logだけではありません。

例えば、効果音を鳴らすこともできます。

public AudioSource attackSound;

public void AttackHit()
{
    attackSound.Play();
}

攻撃アニメーションと効果音のタイミングを合わせられるので、ゲームらしい動きを作りやすくなります。

実際のゲームでは、

AttackHit()

の中で、

  • 敵への攻撃判定

  • ダメージ処理

  • 効果音

  • エフェクト表示

などを行うこともできます。

ただし今回はAnimation Eventの基本を理解することが目的なので、攻撃判定そのものについては扱いません。


Animation Eventの活用

Animation Eventは、さまざまな場面で利用できます。
例えば、歩行アニメーションで、キャラクターが歩いている場合、

  • 左足が地面につく → Animation Event → 足音

  • 右足が地面につく → Animation Event → 足音

と設定できます。
アニメーションに合わせて足音を鳴らせるため、一定間隔で音を鳴らすより自然になります。

他にも、

魔法

CreateMagic();

手を前へ出した瞬間に魔法を生成。

アイテム

ThrowItem();

キャラクターが手を離した瞬間にアイテムを生成。

エフェクト

CreateEffect();

攻撃や魔法のタイミングでエフェクトを表示。

このように、アニメーションの見た目とゲーム処理のタイミングを合わせたい場合にAnimation Eventは便利です。


Animation Eventで関数が表示されない場合

Animation Eventを設定していると、呼び出したい関数が Function一覧に表示されないことがあります。

その場合は、いくつか確認してみましょう。

まず、関数が次のようになっているか確認します。

public void AttackHit()
{
}

今回のようにAnimation Eventから呼び出す関数は、

public

にしておく必要があります。

また、そのスクリプトがAnimationを再生しているGameObjectに付いているかも確認してください。

例えば、PlayerのAnimationから、

AttackHit()

を呼び出したい場合、AttackHitを持つスクリプトがPlayerに付いている必要があります。

その他にも、

  • Consoleにコンパイルエラーが出ていないか

  • Animation Clipを間違えていないか

  • Eventマーカーが正しく追加されているか

なども確認しましょう。


Animation Eventが実行されない場合

Functionを設定したのに処理が実行されない場合は、まずAnimation Clipそのものが再生されているか確認します。

例えば、

Any State → Attack

のTransitionが正しく設定されていない場合、Animation Event以前にAttack Animationが再生されません。

また、EventをAnimation Clipのかなり後ろへ配置している場合、Transitionによって途中で別のStateへ移動すると、Eventへ到達しないこともあります。
そのため、Animationがどこまで再生されているかも確認すると原因を見つけやすくなります。


今回のまとめ

今回は、Animation Eventについて確認しました。

これでAnimator基礎編は終了です。


次回からは、Animatorをもう一歩進めて、Animator応用編 へ進みます。

最初に扱うのは、Blend Treeです。

Idle、Walk、Runなど複数のAnimationを、Parameterの値に合わせて滑らかに切り替える方法を確認していきます。

「歩く」と「走る」を単純に切り替えるだけではなく、速度に合わせてAnimationを自然に変化させることができるようになります。

Animator基礎編で学んだParameterの知識もそのまま利用しますので、ぜひ続けて確認してみてください。


こちらはUnity初心者向けの記事をテーマ別にまとめています。
▼ Unity初心者向け記事まとめはこちら


こちらのマガジン「ミニゲーム作成講座 全8回セット」でもシーンの切り替えなどを活用して、初心者でも知識ゼロから作れるミニゲーム作成講座を紹介しています。

さらにステップアップの「スマホで遊ぶジャンプゲーム 8回セット」のマガジンもぜひご活用ください。


ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。
ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。

いいなと思ったら応援しよう!

ファイブボックス よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!