Unity全般的な話で、VRChatのAvatars3.0にも大いに関わります。
Unity2018.4.20f1および2019.4.29f1に該当。以下の内容は当時VRChatで使用されていたUnity2019.4.29f1向けです。
解決策をお探しの方へ
【追記】2022/8/6
Write DefaultsをOFFにしても確実に動作するようにするには、以下参考にするのが手っ取り早い。
一発で解決できるツールが登場
【追記】2022/8/8
AnimEditUtilityで一連の修正が簡単な操作で可能となりました。
AnimEditUtility 更新しました。https://t.co/0XL0AbRKNJ
— フレア/whiteflare (@whiteflare_vrc) August 6, 2022
WriteDefaults がオンの AnimatorController を、オフの AnimatorController に一発で切り替える機能を追加しました。 pic.twitter.com/ovnBm9jnms
よく分からない場合は、ツールを使用して目的を達成することを推奨いたします。
どのように動作が壊れるのか
検証された方の動画を見るのが早い。
人のアバターでやるとヤバいので自分のアバターでやったけど
— みんたか?Mintaka8/26? (@Mintaka__) August 5, 2022
今まではアバタールートからカリングされたことがなかった。今回VRChatがどういう実装するか分からないけれど
最悪の事態はこうなっちゃってWritedefaultsのヤバいところ pic.twitter.com/vf0wSuqIPW
以下Write DefaultsがONでも動作させる方法。ただし、今後VRChatでこの実装をするとアバターの動作が壊れる可能性が高い。あくまで過去の情報。
対象として考えられるトラブルの事象
服を脱いだはいいが、着られない!
武器を出したはいいが収納できない!状態が変わらない!
出した魔法が止められなくなった!
というような、Write Defaultsが動かなくなる事象について。いわゆるWrite Defaults isn’t workingという状態。
アバターによって動いたり動かなかったり、ツールを使ってAnimator Controllerを触ったらAnimationの動作がおかしくなってしまったりした状態。
魔法が止められなくなった、武器が戻らなくなった
そのため、意見を募ったらわずか3分で回答が。ビンゴでした。
使ってるアニメータの中身全部チェック入ってますか?1つでもオフの状態があると全部オフの挙動になる気がします
— コバルト (@27Cobalter) September 8, 2021
解説
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を使用しないことを推奨していますした。
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で動作するように構成してください。
Write Defaultsの設定をONに統一することにより、不具合回避策を適用することなく武器(写真右上)を装備可能になりました。