【Unity】5.6 のアニメーションは非アクティブ化でリセットされない(5.6のアニメーション挙動の違い) 
2017/04/27 Thu [edit]
これは正直マイッタ…。エラーや警告も出ず、旧機能廃止(obsolute)でもない、ロジックも合ってるハズなのに、なぜか以前のように上手く行かない…。5.5以前のものを5.6に読み込んでみたら何もおかしくないのにバグった(笑)。…と思ったらどうやら 5.6 ではアニメーションの挙動が変わってしまったようだ。Animator の継承関係も変わってるのでメソッドも違うしね。どうやら内部的に変わってしまったらしい。道理でおかしな所が無いわけだ(笑)。
|
※この挙動は 5.6.0p1 以降(パッチリリース)では元に戻っている(非アクティブでアニメーションが最初からになる)。
たぶん、他にも色々変わったところもあるだろうけど、一番困った挙動を書いておこう。それはプレファブを「インスタンス生成→非アクティブ化→再アクティブ化」したとき、アニメーションはリセットされず、終了位置のままになる点だ。以下の動画を見てみると簡単にわかるだろう。
|
5.5以前ではオブジェクトを非アクティブ化するとアニメーションはリセットされ、再びアクティブ化すると初期位置からアニメーションが再生されていたが、5.6では非アクティブ化でリセットされなくなった。なので、最適化などインスタンス生成の負荷を減らすため、使い終わったオブジェクトをプールしておき、再利用するようなキャッシュシステム等は注意する必要があるだろう。アニメーションは初期位置から自動で再生されることはないので、手動でリセットする必要がある。
(元ネタ) 最適化編 オブジェクトプーリング
例えばコードでリセットするなら以下のようにできる。
Animator animator = GetComponent<Animator>();
AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);
animator.Play(stateInfo.fullPathHash, 0, 0.0f); //初期位置に戻す
他にはアニメーションファイルの設定を「ループ(Loop TIme をオン)」にしておき、アニメーションイベントなどを最後のフレームに入れ、そのイベントをスクリプトで受信して SetActive(false) で非アクティブ化する方法でも上手く行った。
実は 5.6 って obsolue(廃止予定・非推奨)も多くなったし、実際に廃止されてエラーも出たりするのもある。またアニメーションだけでなく、他にも挙動が変わってしまったものがあるようだ(コライダやライティング、更にバグもあるらしい)。特に必要性が無いならアップグレードしない方が良いかも知れない。開発中のものがあるなら、5.5.3p2 までにしておいた方が無難だろう。結構痛い目に会うかも(笑)。以下に参考URLを載せておこう。
(参考資料)
・【Unity】「Unity5.6のわりと地雷なバグ」についての補足
・UnityのGameObjectを非アクティブにするとAnimatorがリセットされる挙動、その対処法
(関連記事)
【Unity】5.6 の Collider2Dは非アクティブ化で On~Exit2D イベントが発生する(5.6のコライダ2D挙動の違い)
【Unity】【C#】モバイルビルド中の警告:Game scripts or other custom code contains OnMouse_ event handlers.~ を消す
【Unity】アイコン画像のフォーマット警告:Compressed texture XXX is used as icon. This might compromise visual quality of~ を消す
【Unity】5.6 の Canvas の警告:Shader channels Normal and Tangent are most often used with lighting~ を消す
【Unity】InitializeUnityExtensions: Must have a valid path for the plugin [XX] (XX:番号) というエラーの修正方法
【Unity】"~\Temp\Assembly-CSharp.dll.mdb" is denied. と出たら…
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/242-007f3b12
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |