どうも、ラブヘイトです!
Twitterでいいね、リツイート等沢山していただきありがとうございます
今回はタイトル通りです
前回の記事、
【Blender】→【Unity】Unityちゃんのアニメーション作成してみた #19 - うにty生活
この中で、Unityちゃんに1度だけ発動するアニメーションをつけようとしたところ
苦戦したのでメモします
◆Triggerとは
衝突判定の方ではありません。Animationの方のTriggerです
メカニム(アニメーション管理システム)ではステート遷移のためにパラメーターというフラグを使います
パラメーターの種類↓
今回はこのTriggerパラメーターについてのお話です
TriggerはBoolと似ていますが、一度だけ指定のモーションをしてくれます(Loopの場合は繰り返す)
そのため、使い方が正しければとても便利なのです
◆Triggerの説明・使い方
Triggerは一度だけ発動して自動的に元に戻ります
例えば、"opendoor"というモーションにTriggerでアニメーション遷移をしたい時のアニメーションコントローラーはこんな感じ↓
遷移するコードはこれです
◆いらいらポイント
1.高速に実行されているメソッドで使用できない
2.元のアニメーションへの戻し方がわからない
3.たまに自動で戻らない
1.高速に実行されているメソッドで使用できない
これはもちろんUpdateに直に書いてはいけないですが、if(Input.GetKey)などの中やfor内ではうまく動作しません
一度だけ動作する場所に記述しましょう
後は、衝突した時などに使えそうな気がします
2.元のアニメーションへの戻し方がわからない
リファレンスに戻り方は記されていませんでした
というか内容の薄さに驚きました。もしかするとメカニムでの設定は別のページなのかもしれません
結果を先に記述すると、元のアニメーションに戻るにはトランジョンのConditionに何も設定しないことです
上の画像でcoldステートに返っている方のトランジョンです
このようにConditionには何も設定しなくて良いです
かなり探しました
3.たまに自動で戻らない
この不具合は原因がわからず、再現できないため経験談になります(全部経験談やけど)
普通Triggerは一度呼び出すと、1回だけ実行して元に戻りますよね?
しかしたまに戻らない時があるのです
原因はどうであれ明示的に元に戻すメソッドが用意されています
Unity - スクリプティング API: Animator.ResetTrigger
これが使いにくい!
というかそもそもTrigger戻らない時点で、アニメーションシステムが動作しなくなるので明らかに不具合です
まずsetTrigger使ってすぐResetTrrigerを使った場合
これだと確かにTriggerはリセットされています
ただ高速にTriggerがOnOffするだけなのでTriggerで発動したいアニメーションが発動しない。これでは意味がありません
Triggerが戻らなくても別にエラーも何も出ないので例外処理でもキャッチできず、アニメーション止まってしまうし、ResetTriggerを有用に使う記事は見当たりませんでした
いつ使うのやら・・・
◆応用編
Tiggerは一度使ったら元のアニメーションに戻ると説明しました
Triggerを使って連続で同じアニメーションをするには、Boolと併用します
まずはBoolパラメーターを作成します。OpenDoorというパラメーターを用意しました
次にステートとトランジョンの設定です
cold->test に「Opendoor/ false」
test->coldには「Opendoor/true」
testステートには自分自身にトランジョンを設定します。他のトランジョンと一緒でMake Transionして少し離し、またステートに戻すと設定可能です。
Conditionには「Door」ステートを設定します
実際の動きと合わせてメカニムの動きも見て行きましょう
Opendoorを falseに戻せばもちろん前のアニメーションに戻ることが可能です!
どこかで使うことがあるかもしれませんね
というとこで今回はブログでの怒り発散コーナーでした笑
--------------------------------------------------------------------------------
※当ブログにおいてナンバリングはあまり関係ありません
私とブログの成長記のようなものです