今回はWrite Defaultsについて。
この挙動は少し分かりにくいので、少し補足します。
Write Defaultsという項目
AnimatorのWrite Defaultsの項目のマニュアルを見ると、下のような物のようです。
Write Defaults : AnimatorStates を書くかどうかにかかわらず、その Motion によってアニメーション化されてないプロパティーによってデフォルト値に戻します。
さて、「Motionによってアニメーション化されていないプロパティのデフォルト値」とは何でしょう。
キーが未定義なアニメーションは起動時のパラメータをデフォルト値として使う
プロパティのデフォルト値は、要するにAnimatorの起動時の位置やパラメータです。
AnimationClipが変更するオブジェクトや座標のパラメータを事前に保持しておき、特にキーが設定されていない項目は、その値を基準にブレンドを行うみたいです。
例えば下のGifアニメでは、最終的な座標(左下)のみを持つアニメーションを用意し、キーを何も持たないアニメーションからブレンドさせています。
Animatorを起動すると、デフォルト値はAnimator起動時の位置になるので、UIを配置した位置から最終的な座標(左下)へブレンドする形でアニメーションしています。*1
Write Defaultsという項目
ネタバラシをすると、Write Defaultsの項目は要するに「アニメーションキーが設定されていない項目はデフォルト値を使用する」という項目です。
例えば下のようなUIを用意し、それぞれ「Sample 1のUIみ動かすアニメーション」「Sample 2のUIのみ動かすアニメーション」「Sample 3のUIのみ動かすアニメーション」を用意します。
このUIを動かすアニメーションを順番に再生すると、特にキーを設定しなくてもUIが仕舞われる感じのアニメーションが再生されます。
これはキーを設定していない項目はデフォルト値を元にブレンドしている為です。
逆にWrite Defaultのチェックを外していた場合、該当ステートではデフォルト値による上書きが無くなります。上のアニメーションの場合、UIを仕舞う挙動が無くなり、最後にアニメーションした位置がそのまま使用されます。
注意点
デフォルト値が保持されるケースの問題
なお保持するのはAnimationClipが変更する項目で、それ以外の項目は保持しないみたいです。保持するのは現在再生中のAnimationClipが変更するパラメータではなく、AnimationControllerが保持する全AnimationClipのいずれかが変更するパラメータです。つまり、AnimationControllerに含まれてるだけで効果を持ちます。
Write Defaultの有無に関わらず、AnimationClipで動かすパラメータはスクリプト上で動かす場合は注意が必要です。
デフォルト値がリセットされるケース
Write Defaultsを使用する上で一番の問題は、ここで使用するデフォルト値はAnimatorを含むGameObjectを非アクティブにするとリセットされ、アクティブ化した際のパラメータが利用されるという意味不明な仕様です。
例えばWrite Defaultsを使用中にGameObjectを一度非アクティブにすると、デフォルト値が変わってしまう為UIの切替が中途半端になります。
tsubakit1.hateblo.jpので、Animatorを含むGameObjectの非アクティブ化は避け(親オブジェクトの非アクティブ化でも同様)、Animatorのみをdisableにしないと、ややこしい事が起こります。*2
ちなみに、表情にBlendShapeを使いつつデフォルト値を前提に使用している場合、状態が混ざって面白い顔になる事があります。上のような感じ。
(他の表情が50とかの状態がデフォルト値となり、色々な表情が混ざる)