Unity

Animatorで同じステートを繰り返す

投稿日:

loop_arrow

たとえばキャラがダメージを受けて、ダメージモーションを再生中に攻撃を受けたらまたダメージを受けるという仕様だったとします。これをどう実装するかという話です。先のInterruption Sourceの使用法でもあります。

ググってみると、Animator.Play("Damage", 0, 0f) などとしてステートを頭から再生する方法が出てきます。でもこれ、他のステートからワープしてきたら、その時のトリガーがリセットされずに残ってしまいませんか?(このへん何が問題なのか具体的な説明は別記事を書きます)

モーションにもよるんですが、Play()で頭からまた再生だとブレンドされないので見た目もあまり良くないです。

ここは単純に、Controllerの記述だけでなんとかしたいところです。

ダメージ中にダメージを受けるところ

実現方法は
・WAIT -> DAMAGEは、普通にDamageトリガーで遷移(Has Exit Time はチェックしない)
・DAMAGE -> WAIT の矢印を2つ引きます。
 1つめ Has Exit Time をチェックする。Conditionsはなし。Interruption Sourceは Next Stateとします。
 2つめ Has Exit Time をチェックしない。ConditionsはWaitトリガー、Interrupution Source は Next Stateとします。

1つめの矢印は、ダメージモーションを最後まで再生し終わったらWAITに戻るためのものです。戻り中にダメージを受けたときのために Interruption SourceをNext Stateとしています。

2つめの矢印は、ダメージ中にまたダメージを受けた場合の遷移です。ダメージを受けたら、いまのステートがどこであろうともDamageトリガーとWaitトリガーを両方セットします。また、WAITステートから出るときに(StateMachineBehaviour.OnStateExit()で)もしWaitトリガーがセットされていたらリセットするようにします(WAITステートでダメージを受けたときはWaitトリガーがセットされているとDAMAGEに遷移したらすぐに戻ってしまうので)

これでダメージ途中のモーションからブレンドしつつ頭からまた再生できました。

この説明だけだと、ただややこしいだけで何が嬉しいのか謎だと思いますが、これから徐々に明らかにしていきます。

-Unity

Copyright© みじんこゲームズ , 2024 All Rights Reserved Powered by STINGER.