テラシュールブログ

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

【Unity】知らないと面倒くさい事になるかもしれないAnimatorの「Write Defaults」の動作について

 今回はWrite Defaultsについて。

この挙動は少し分かりにくいので、少し補足します。

Write Defaultsという項目

f:id:tsubaki_t1:20170116000110j:plain

AnimatorのWrite Defaultsの項目のマニュアルを見ると、下のような物のようです。

Write Defaults : AnimatorStates を書くかどうかにかかわらず、その Motion によってアニメーション化されてないプロパティーによってデフォルト値に戻します。

 さて、「Motionによってアニメーション化されていないプロパティのデフォルト値」とは何でしょう。

キーが未定義なアニメーションは起動時のパラメータをデフォルト値として使う

プロパティのデフォルト値は、要するにAnimatorの起動時の位置やパラメータです。

AnimationClipが変更するオブジェクトや座標のパラメータを事前に保持しておき、特にキーが設定されていない項目は、その値を基準にブレンドを行うみたいです。

例えば下のGifアニメでは、最終的な座標(左下)のみを持つアニメーションを用意し、キーを何も持たないアニメーションからブレンドさせています。
Animatorを起動すると、デフォルト値はAnimator起動時の位置になるので、UIを配置した位置から最終的な座標(左下)へブレンドする形でアニメーションしています。*1

http://cdn-ak.f.st-hatena.com/images/fotolife/t/tsubaki_t1/20150205/20150205101008.gif

f:id:tsubaki_t1:20170116002224j:plain

Write Defaultsという項目

ネタバラシをすると、Write Defaultsの項目は要するに「アニメーションキーが設定されていない項目はデフォルト値を使用する」という項目です。

例えば下のようなUIを用意し、それぞれ「Sample 1のUIみ動かすアニメーション」「Sample 2のUIのみ動かすアニメーション」「Sample 3のUIのみ動かすアニメーション」を用意します。

f:id:tsubaki_t1:20170116003958j:plain

f:id:tsubaki_t1:20170116004112j:plain

このUIを動かすアニメーションを順番に再生すると、特にキーを設定しなくてもUIが仕舞われる感じのアニメーションが再生されます。

これはキーを設定していない項目はデフォルト値を元にブレンドしている為です。

f:id:tsubaki_t1:20170116004548j:plain

f:id:tsubaki_t1:20170116004403g:plain

逆にWrite Defaultのチェックを外していた場合、該当ステートではデフォルト値による上書きが無くなります。上のアニメーションの場合、UIを仕舞う挙動が無くなり、最後にアニメーションした位置がそのまま使用されます。

f:id:tsubaki_t1:20170116004809j:plain

f:id:tsubaki_t1:20170116004814g:plain

注意点

デフォルト値が保持されるケースの問題

なお保持するのはAnimationClipが変更する項目で、それ以外の項目は保持しないみたいです。保持するのは現在再生中のAnimationClipが変更するパラメータではなく、AnimationControllerが保持する全AnimationClipのいずれかが変更するパラメータです。つまり、AnimationControllerに含まれてるだけで効果を持ちます。

Write Defaultの有無に関わらず、AnimationClipで動かすパラメータはスクリプト上で動かす場合は注意が必要です。

tsubakit1.hateblo

デフォルト値がリセットされるケース

Write Defaultsを使用する上で一番の問題は、ここで使用するデフォルト値はAnimatorを含むGameObjectを非アクティブにするとリセットされ、アクティブ化した際のパラメータが利用されるという意味不明な仕様です。

例えばWrite Defaultsを使用中にGameObjectを一度非アクティブにすると、デフォルト値が変わってしまう為UIの切替が中途半端になります。

f:id:tsubaki_t1:20170116010217g:plain

tsubakit1.hateblo.jpので、Animatorを含むGameObjectの非アクティブ化は避け(親オブジェクトの非アクティブ化でも同様)、Animatorのみをdisableにしないと、ややこしい事が起こります。*2

f:id:tsubaki_t1:20170116012707j:plain

ちなみに、表情にBlendShapeを使いつつデフォルト値を前提に使用している場合、状態が混ざって面白い顔になる事があります。上のような感じ。
(他の表情が50とかの状態がデフォルト値となり、色々な表情が混ざる)

関連

tsubakit1.hateblo.jp

*1:この手法でUIを動かす場合、ブレンド率はリニア強制なので硬い動きしか表現出来ません。やるならブレンドツリーでやる事をお薦め。というかTweenお薦め

*2:正直、この仕様のせいでWrite Defaultsは死に機能になってる感がある