Unity 3Dキャラ待機モーションと攻撃モーションの切替4/4

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

前回の記事:Unity 3Dキャラ待機モーションと攻撃モーションの切替3/4 | Compota-Soft-Press

Unity AnimationController のパラメータをアニメーション完了後にリセットしない場合、何度も同じ遷移を繰り返してしまいます.2/2

攻撃アニメーション完了後、待機ステートに戻った直後に、勝手に攻撃アニメーションに遷移しないようにするには、Attacking パラメータを false に戻す関数を呼び出す必要があります。

今回は、アニメーションクリップの任意のフレームに追加できるアニメーションイベントを用いて任意の関数を呼び出して、パラメータを制御して待機→攻撃→待機の流れを完成させる手順を紹介します。
※ Unity のバージョンは 2021.3.25f1 です。3D キャラクターは Unity の無料アセット「Adventure Character」を使用しています。アニメーションは「Mixamo」から入手したものを使用しています。

AnimationEvent の設定

アニメーションイベントは、アニメーションクリップの任意のフレーム(指定の時間)に追加できます。

例では、攻撃アニメーションの終盤にアニメーションイベントを追加します。
「攻撃」アニメーションクリップは、Animator ウィンドウの攻撃ステートを選択して、 Inspector ウィンドウの Motion の要素を選択すると、 Project ウィンドウに表示されます。

Project ウィンドウのアニメーションクリップをダブルクリックして、 Animation ウィンドウで「攻撃」アニメーションクリップを開きます。

Unity Animator ウィンドウのステートを選択し、Inspector ウィンドウで Motion を選択すると Project ウィンドウにそのアニメーションクリップの場所が表示されます.

Animation ウィンドウで、「攻撃」アニメーションクリップの終盤のフレームにアニメーションイベントを追加します。

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

Unity AnimatorController の攻撃ステートで呼び出される AnimationClip の最後のフレームにアニメーションイベントを追加します.

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

Unity アニメーションクリップに追加したアニメーションイベントを選択します.

Inspector ウィンドウでアニメーションイベントを設定できます。
アニメーションイベントでは、 Function フィールドで、呼び出す関数名を指定します。

これにより、そのアニメーションクリップを実行するゲームオブジェクトの持っているスクリプトの中からその関数が呼び出されます。

今回の例では、Attacking パラメータを true から false に戻す OnAnimationEventAttackingFinished 関数がアニメーション終盤に呼び出されるようになりました。

Unity アニメーションイベントで呼び出す関数名と必要ならば引数を指定します.

再生直後に発生する指定した関数が見つからないエラー

Animation Event の Function フィールドに関数名を設定していない場合、シーン再生直後に次のようなエラーが Console ウィンドウに表示されたので紹介します。

'Man_Full' AnimationEvent has no function name specified!
Unity アニメーションイベントを追加すると、シーンの再生直後にエラーが発生しました.

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

Unity Function 名が設定されていない無効なアニメーションイベントを追加していたので削除します.

テスト

アニメーションイベントを「攻撃」アニメーションクリップ終盤に追加して、そこから Attacking パラメータを false に戻す関数を呼ぶようにしました。

これにより、攻撃アニメーション完了後、待機アニメーションが実行されるようになりました。
スペースキーで攻撃を再び指示すれば、1回目と同様のアニメーションの遷移が行われました。

※ シーン再生時に Animator ウィンドウのステートの青いプログレッシブバーを表示するには、そのアニメーションを行っているゲームオブジェクト(例では Man_Full)を選択しておく必要があります。

まとめ

今回は、Unity のアニメーションクリップの任意のフレームに追加できるアニメーションイベントを用いて、アニメーションの任意のタイミングで指定した関数を呼び出す手順を紹介しました。
これにより、キー入力によって待機ステートから攻撃ステートに勝手に遷移を繰り返す問題を解消するための関数(アニメーションパラメータのリセット)を呼び出し、攻撃アニメーションのあと待機アニメーションが再生されるようになりました。

参照サイト Thank You !

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました