テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】AnimationControllerのAnyStateを使用してる際、現在のStateへ何度も移動しないようにする

今回は小さなTipsです。

f:id:tsubaki_t1:20170114000055g:plain

例えば上のように「どれか一つのUI状態を持つ」UIをAnimationControllerで管理し、かつAnyStateから呼び出すように作成した際、Triggerを叩くと何度もUI表示アニメーションが再生されてしまうといった事があります。

AnyStateの先へは何処からでも行ける

下Gifでは、UIの切替にAnyStateを使用してみましたが、ShowItem1が呼ばれる度にアイテムを表示するアニメーションが再生されてしまいます。

これはAnyStateの先に登録しているため、既にアニメーションが再生していた場合でもAnyStateへ戻り再度アニメーションを再生してしまう為です。

f:id:tsubaki_t1:20170113235304g:plain

Can Transition To Self

そんな時は、Transition(矢印)の設定にあるCan Transition To Selfのチェックを外します。これで、自身に遷移するアニメーションは無視されるようになります。

f:id:tsubaki_t1:20170114000259j:plain

f:id:tsubaki_t1:20170114000612g:plain

Triggerは使われないと消えない

この手法には一つ穴があります。それはTriggerはConditionの判定に使用された時に初めてチェックが外れるという仕様です。

例えばTriggerで次のステップへ移動する処理を作成しますが、Step2のみ時間移動とします。そうすると、Step2でTriggerが呼ばれてしまうと、Step3に移動した瞬間ステートを切り替えてしまいます。

f:id:tsubaki_t1:20170114001651g:plain

その為、Trigger実行中に他のステートに切り替えようとすると、一瞬別のステートに行きますがTriggerが再度判定されステートが戻ってくるといった事になります。

f:id:tsubaki_t1:20170114002124g:plain

ステート切替時にTriggerを消す

場当たり的な対処となりますが、ステート切替時にTriggerを消すと、この問題を回避出来ます。要するにStatemacihneBehaviourのOnStateExitのタイミングでTriggerを初期化すれば良いのです。

f:id:tsubaki_t1:20170114002505j:plain

gist.github.com

まぁ、ここまでしてAnyStateを使いたいかと言われると微妙な気もしなくもないですが…

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp