FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【Unity】Animator(uGUIの2Dアニメーション)終了検知

①概要
過去記事のゲームクリア画面の後に結果を表示する2Dアニメーションを制作しました。
途中まではAnimatorを使ったuGUIの2Dアニメーションで、その後スクリプトでいくつかの処理を行ないましたが、Animatorの終了検知で手間取ったのでメモします。
20160828_01.gif

②参考
【日記】ゲーム開始とゲームクリア画面を制作 ※過去記事
【Unity】Animatorのアニメーション終了待ちをする方法

③処理フロー
1."Resut"Animatorにて、uGUIのアニメーション(背景を表示した後、"Mission"のチェックを表示する)を再生する。
20160828_02.jpg

2.手順1の終了を検知したら、"Mission"の達成度からクリアランク(S/A/B/C)を算出し、SpriteRendererでいずれかを表示する。同じタイミングでパーティクルのエフェクトを再生する。
20160828_03.jpg

3.手順2の後、"CLEAR TIME"と"MAX COMBO"を表示する。
20160828_04.jpg

④詳細
"Default"から"Result"へ遷移すると、uGUIアニメーションが再生されます。
20160828_05.jpg
↑Animation Controller
20160828_06.jpg
↑"Result" Animator
"Result"の終了を検知したら、次へ進みます。
終了検知は参考記事の通り"m_Animator.GetCurrentAnimatorStateInfo(0).normalizedTime"で判定しましたが、ここでしばらく手が止まりました。
m_Animator.GetCurrentAnimatorStateInfo(0).normalizedTimeの値が1以上になると終了となるはずですが、"Result"へ遷移命令を実行した直後にも関わらず1よりも大きな値(14や15など)を検知してしまったからです(0~0.99... が一度も検知できなかった)。

検証したところ、どうやら"Default"の値を拾ってしまっていたようです。
スクリプトでは遷移命令(m_Animator.SetTrigger("Result"))を行った直後から終了検知(if(m_Animator.GetCurrentAnimatorStateInfo(0).normalizedTime>1))をさせていましたが、実際には"Result"へ遷移完了するまで僅かに待機する時間が必要でした。。
終了検知のifはUpdateイベント内で行っていますが、Animatorと同期しているわけではないので、遷移完了するよりも先に次のUpdateイベントが実行されてしまい、"Default"を拾ってしまったようです。

そこで下のように"Result"でないならばスキップするようにして解決しました。

⑤まとめ
UpdateイベントとAnimatorは非同期なので、適宜タイミングを考慮しなければならない。
・「m_Animator.GetCurrentAnimatorStateInfo(0).IsName(Animatorの名前)」で現在状態を確認可能。
・「m_Animator.GetCurrentAnimatorStateInfo(0).normalizedTime」で現在のAnimatorの進行具合を確認可能。1.0が再生完了のタイミングであり、2周目以降があるならば1.0よりも大きな値になる。

⑥備考
・Unity 5.3.1p1を使用しています。

ユニティちゃんライセンス

この作品はユニティちゃんライセンス条項の元に提供されています



以上。
スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。