Write DefaultsはAnimator Controllerで統一しましょう

この記事は約10分で読めます。

Unity全般的な話で、VRChatのAvatars3.0にも大いに関わります。
Unity2018.4.20f1および2019.4.29f1に該当。以下の内容は当時VRChatで使用されていたUnity2019.4.29f1向けです。

【追記】2024/3/15

Write Defaultsの設定はOFFでもONでも問題ないようになりました。
ただし、混ぜてはいけません。

VRChat 2024.1.2
Open Beta - 14 March 2024 - Build 1431
Avatars | VRChat Creation
VRChat allows you to create and upload custom avatars!

はじめに

ここに書いてあることは、アバターに仕込んでいるギミックでWrite DefaultsがどうしてもOFFにできないものがある場合の次善策です。
すべてのアバターギミックでWrite DefaultsをOFFで構成できる場合は、Write DefaultsをOFFで構成することを推奨いたします。

【追記】2022/8/18

当面はWrite DefaultsをONで構成しても、直ちに影響が発生しないような仕様に変更される見込みとなりました。アバターが隠されても、Animator Controllerが停止しないような仕様変更がなされます。
負荷の軽減よりも、既存のアバターの動作が壊れないほうが今のところ良いと運営チームが判断したようです。
ただし、将来的にこの仕様は見直される可能性があります。

Developer Update - 16 August 2022
Hello! Welcome to the latest VRChat developer update for 16 August, 2022. This week, we’ve moved to two Dev Updates a we...

【追記】2022/8/5
Write DefaultsをONで構成すると、近日中にアバターの動作が壊れるおそれがあります!

アバターを距離で隠す機能が実装されますが、アバターが隠されたときにAnimator ControllerおよびAnimationが停止する場合があります。
その際Write DefaultsがONでは、途中でAnimationが停止したときの状態をDefaultとして記憶してしまう場合があります。結果として予期せぬ動作を引き起こす可能性があります。

Developer Update - 4 August 2022
Hello! Welcome to the latest VRChat Developer Update. Here’s what we were up to today. Check out our Dev Update from yes...

解決策をお探しの方へ

【追記】2022/8/6

Write DefaultsをOFFにしても確実に動作するようにするには、以下参考にするのが手っ取り早い。

一発で解決できるツールが登場

【追記】2022/8/8

AnimEditUtilityで一連の修正が簡単な操作で可能となりました。

よく分からない場合は、ツールを使用して目的を達成することを推奨いたします。

どのように動作が壊れるのか

検証された方の動画を見るのが早い。

以下Write DefaultsがONでも動作させる方法。
ただし、今後VRChatでこの実装をするとアバターの動作が壊れる可能性が高い。あくまで過去の情報。

対象として考えられるトラブルの事象

【追記】2022/8/8

AnimEditUtilityによって、対応難易度は大きく低下しています。簡単な操作でWrite DefaultsをOFFにした構成を行えます。
Write DefaultsをONの構成は不具合の温床となりえるため、非推奨です。 → 2023/3/15追記 ONとOFFが統一されていれば問題にならないとされました。

服を脱いだはいいが、着られない!
武器を出したはいいが収納できない!状態が変わらない!
出した魔法が止められなくなった!

というような、Write Defaultsが動かなくなる事象について。いわゆるWrite Defaults isn’t workingという状態。

アバターによって動いたり動かなかったり、ツールを使ってAnimator Controllerを触ったらAnimationの動作がおかしくなってしまったりした状態。

動作がおかしくなっても、EXメニューからReset Avatarすることで一時的には元の状態に戻る。

魔法が止められなくなった、武器が戻らなくなった

そのため、意見を募ったらわずか3分で回答が。ビンゴでした。

解説

UnityにおいてAnimator Controller(以下アイコン)を使用するとステートマシン形式でアニメーションの起動が可能です。

このAnimator Controllerの1ファイル内にWrite DefaultsのONとOFFのステートが混在していると、実質的にWrite Defaultsにチェックを入れているステートでもOFFとなり正常にアニメーションが動作しなくなることがあります。

Animator Controllerは以下のような構成をしていますが、左側に多数のレイヤーがある中ですべてのレイヤーのすべてのステートでどちらかにWrite Defaultsを統一しない場合、不具合の原因となります。

Write Defaultsを統一するには?確認するには?

Unity上の操作ですべてのレイヤーで一括して統一することはできません。
テキストエディタ上でAnimator Controllerを直接書き換える方法もありますが、レイヤー数が数えられるうちはUnity上の操作で可能です。

レイヤー内のすべてのステートを選択します。
Inspectorで、11 Animator States(数字は環境により異なります)を選択します。

Write Defaultsのチェックを確認します。
チェックがついているか外れているかを確認してください。チェックボックスにマイナス記号が表示されている場合、混在しており統一されていません。いずれかに統一してください。

また、同一Animator Controller内の異なるレイヤーで統一されていない場合でもバグの温床となります。
すべてのレイヤーで統一してください。下層のレイヤーで実行されるAnimationは上層のレイヤーで実行されたAnimationの値を上書きします。

【追記あり】VRChatはWrite Defaults OFFを推奨していたようですが?

【追記】2024/3/15
Write DefaultsはONとOFFを混ぜていない限り、問題がないとされました。

Regardless of which option you choose, we recommend keeping your usage of Write Defaults consistent across the entire avatar – in other words, have Write Defaults “Off” for all states, or “On” for all states. Having both “Off” and “On” states on an avatar is known to cause unexpected property values to be set. This is commonly known as “Mixed Write Defaults”. The SDK will give you a warning if it detects that you’ve done this.

https://vrc-beta-docs.netlify.app/avatars/#write-defaults-on-states

確かに、VRChatの運営はWrite Defaultsを使用しないことを推奨していました。

Avatars 3.0
What is Avatars 3.0? Avatars 3.0 is a huge collection of features for avatars in VRChat. You can think of it as a new ve...

VRChat does not use “Write Defaults” in our built-in and example animators. This means that only the actual properties that are in animations get played by any one animation node. We recommend that creators also follow this workflow, as it is easier to keep track of what properties will be animated through any specific layer.

SDKに標準で組み込まれたAnimator ControllerはWrite Defaults OFF前提で作られており、Examples3フォルダに展開されているAnimator ControllerもWrite Defaults OFFで用意されています。

先ほども説明いたしました通り、Write DefaultsがONとOFFで混在すると不具合の原因となります。
どちらかに統一する必要があります。
1つでもAnimationでWrite Defaults OFFに対応できないレイヤーおよびステートがある場合、すべてのレイヤーのすべてのステートでWrite DefaultsをONにしてください。

あくまでVRChatが定めている開発者としての推奨事項には反することになりますが、中途半端に対応するとかえって動作不具合の原因となるため、Write DefaultsはONもしくはOFFどちらか一方に統一することを推奨いたします。

【追記】
近日中にVRChatに実装される機能の影響で壊れる可能性が高いです。Write Defaults OFFで動作するように構成してください。

【追記】2022/1/30

これは暫定的な対応方法です。Write Defaults ONのままでは引き続き別の不具合が発生する可能性をはらんでいます。

以上のブログでも解説されているように、Write Defaultsは本来OFFが推奨です。
しかし対応できないアバターギミックがあるような場合は、中途半端に一部のステートのみOFFにするよりもやむを得ず全てONに統一するほうが動作上はマシです。

アバターを作り直したり、大規模な変更を加えたりするような機会があった場合はWrite Defaults OFFでも動作するように設計することをおすすめいたします。

【追記】2022/8/5

Write Defaults ONで構成していると先述の通り、近日中に壊れるおそれがあります。

Write Defaultsの設定をONに統一することにより、不具合回避策を適用することなく武器(写真右上)を装備可能になりました。

タイトルとURLをコピーしました