かなり久々のUnityのゲーム開発記事になってしまいました。
なかなかUnityを開いて作業する時間がなかったので更新が滞っていましたが、まだまだ実装できそうな要素がたくさんあるので、ぼちぼちと進めていきます。
今回は、ユニティちゃんがダメージを受けた際のアニメーションの設定からユニティちゃん(プレイヤー)の移動する条件を決めたいと思います。
【Unity】プレイヤーは攻撃時以外は移動出来るようにする
現状プレイヤーも敵も、移動や攻撃アニメーションは実装していますがお互い攻撃を受けた際のアニメーションが発生しませんので、まずはダメージアニメーションを追加します。
ユニティちゃんのダメージアニメーションの設定
Any Stateの中にDamageを作成します。パラメーターはTriggerで「Damage」にします。
Any StateからDamageのConditionsは「Damage」にしてDamageからExitは上の画像のように変更します。
Statusmanagerスクリプトの修正
新たにDamageというステートを作成します。それに伴いDamageメソッドも多少修正しています。
要は、ダメージが発生した際にSetTriggerを利用してダメージアニメーションを発動するだけです。
プレイヤーの移動処理を記述しているスクリプトの修正
プレイヤーの移動条件に、アニメーションステートがDamageの場合でも移動出来るようにします。
この処理を加えないと、敵から攻撃を受けている最中にダメージアニメーションが無限ループしてユニティちゃんが動かなくなってしまう場合があります。
この現象は、ユニティちゃんが攻撃中に敵からの攻撃を受けてアタックアニメーションの再生途中でダメージアニメーションに移行した際に発生します。
AttackスクリプトにあるAttackEndメソッドは、ユニティちゃんの攻撃アニメーションのイベントにて実行されます。
途中で敵からの攻撃を受けてダメージアニメーションに切り替わってしまうと、本来Normalステートに移行するはずが、以降せずにAttackの状態のままになってしまうので、ユニティちゃんが動かなくなってしまいます。
敵は、プレイヤー側をひたすら攻撃する仕様ですので、ダメージアニメーションが実質無限ループしてしまう状態になるわけです。
実はダメージアニメーション再生後にアニメーションイベントからGoToNormalメソッドを呼び出すだけで良い
ここまでの説明を聞いて分かる人もいると思いますが、ユニティちゃんのダメージアニメーションが再生された直後にStatusmanagerスクリプトにあるGoToNormalメソッドを呼び出せば良いんです。
これならば、新たにステートを作成しなくてもStatusmanagerスクリプトにある54行目のトリガーの記述だけ追記すればOKです。
これで、攻撃時以外では移動できるようになりました。敵から攻撃を受けた際にダメージアニメーションがループすることもありませんね。