前回は、Unity の AnimationController のアニメーションパラメータをキー入力に応じて変更することで、待機から攻撃ステートへ遷移させ、3D キャラクターのアニメーションを切り替える自作プログラムを公開し、関数単位で処理内容を説明しました。
パラメータが戻らないせいで攻撃アニメーションが繰り返されてしまう問題についても確認しました。
前回の記事:Unity 3Dキャラ待機モーションと攻撃モーションの切替3/4 | Compota-Soft-Press

攻撃アニメーション完了後、待機ステートに戻った直後に、勝手に攻撃アニメーションに遷移しないようにするには、Attacking パラメータを false に戻す関数を呼び出す必要があります。
今回は、アニメーションクリップの任意のフレームに追加できるアニメーションイベントを用いて任意の関数を呼び出して、パラメータを制御して、待機→攻撃→待機の流れを完成させる手順を紹介します。
※ Unity のバージョンは 2021.3.25f1 です。3D キャラクターは Unity の無料アセット「Adventure Character」を使用しています。アニメーションは「Mixamo」から入手したものを使用しています。
AnimationEvent の設定
アニメーションイベントは、アニメーションクリップの任意のフレーム(指定の時間)に追加できます。
例では、攻撃アニメーションの終盤にアニメーションイベントを追加します。
「攻撃」アニメーションクリップは、Animator ウィンドウの攻撃ステートを選択して、 Inspector ウィンドウの Motion の要素を選択すると、 Project ウィンドウに表示されます。
Project ウィンドウのアニメーションクリップをダブルクリックして、 Animation ウィンドウで「攻撃」アニメーションクリップを開きます。

Animation ウィンドウで、「攻撃」アニメーションクリップの終盤のフレームにアニメーションイベントを追加します。
Animation ウィンドウの上側の経過時刻が表示されている部分をクリックすると、白い縦線が表示されて、その時刻のフレームが選択されます。
その状態で、「縦長長方形に+」のボタンを押すと、そのフレームにアニメーションイベントを追加できます。

追加したアニメーションイベントの縦長長方形のアイコンを選択します。

Inspector ウィンドウでアニメーションイベントを設定できます。
アニメーションイベントでは、 Function フィールドで、呼び出す関数名を指定します。
これにより、そのアニメーションクリップを実行するゲームオブジェクトの持っているスクリプトの中からその関数が呼び出されます。
今回の例では、Attacking パラメータを true から false に戻す OnAnimationEventAttackingFinished 関数がアニメーション終盤に呼び出されるようになりました。

再生直後に発生する指定した関数が見つからないエラー
Animation Event の Function フィールドに関数名を設定していない場合、シーン再生直後に次のようなエラーが Console ウィンドウに表示されたので紹介します。
'Man_Full' AnimationEvent has no function name specified!

もしも、不要なアニメーションイベント(Function 未設定)を作成してしまった場合は、そのアニメーションイベントの縦長長方形を右クリックして表示されるメニューで「Delete Animation Event」を選択してアニメーションイベントを削除することで、このエラーは解消されます。

テスト
アニメーションイベントを「攻撃」アニメーションクリップ終盤に追加して、そこから Attacking パラメータを false に戻す関数を呼ぶようにしました。
これにより、攻撃アニメーション完了後、待機アニメーションが実行されるようになりました。
スペースキーで攻撃を再び指示すれば、1回目と同様のアニメーションの遷移が行われました。




※ シーン再生時に Animator ウィンドウのステートの青いプログレッシブバーを表示するには、そのアニメーションを行っているゲームオブジェクト(例では Man_Full)を選択しておく必要があります。
まとめ
今回は、Unity のアニメーションクリップの任意のフレームに追加できるアニメーションイベントを用いて、アニメーションの任意のタイミングで指定した関数を呼び出す手順を紹介しました。
これにより、キー入力によって待機ステートから攻撃ステートに勝手に遷移を繰り返す問題を解消するための関数(アニメーションパラメータのリセット)を呼び出し、攻撃アニメーションのあと待機アニメーションが再生されるようになりました。
参照サイト Thank You !
- Unity アセットストア – ゲーム制作のための最高のアセット
- Mixamo
- アニメーションパラメーター – Unity マニュアル
- アニメーション遷移 – Unity マニュアル
- アニメーションイベントの使用 – Unity マニュアル
記事一覧 → Compota-Soft-Press
コメント