テラシュールブログ

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

【Unity】新・AnimatorのGameObjectを非アクティブにするとステートマシンがリセットされる問題の対処法

f:id:tsubaki_t1:20181004235357j:plain

以前、下のリンクで紹介した「AnimatorのGameObjectを非アクティブにするとステートマシン(その他諸々)が破棄される」問題の、対処法です。

tsubakit1.hateblo.jp

Animator.keepAnimatorControllerStateOnDisable

新しい解決方法は簡単で、animator.keepAnimatorControllerStateOnDisable = true;を呼び出すだけです。これでオブジェクトが非アクティブになった時でもステートマシンがリセットされません。

https://docs.unity3d.com/ja/2018.3/ScriptReference/Animator-keepAnimatorControllerStateOnDisable.htmldocs.unity3d.com

keepAnimatorControllerStateOnDisableはシリアライズが可能

ここで驚くべきというか面白いというかユニークなのは、Animator.keepAnimatorControllerStateOnDisableという設定、実はシリアライズが可能という事です。 エディター拡張等でAnimatorを持つPrefab郡に対して片っ端からanimator.keepAnimatorControllerStateOnDisable = true;を実行してやれば、初期化コード等が無くとも非アクティブ時のステートマシン破棄を防ぐ事が出来ます。

なおInspectorをDebugにすると、Inspector側からでも設定が可能です。

f:id:tsubaki_t1:20181004235930j:plain

何故か言語設定を「日本語」にしてると、Inspectorで表示される項目名が全く違う名前(アニメーターコントローラーレイヤー)になってるので、そこんとこ注意です。

追記: WriteDefaultは相変わらずリセットされる(正確にはアクティブ時に書き込まれてしまう)ので、GameObjectのアクティブ切替はまだ注意が必要です。

tsubakit1.hateblo.jp