bdunderscore / modular-avatar

Other
476 stars 61 forks source link

衣装追従モードが変更出来ないことがある原因を知りたい #843

Open Sayamame-beans opened 4 months ago

Sayamame-beans commented 4 months ago

状況(衣装やMissing Scriptの有無?)によって、以下のエラーが表示されて衣装追従モードが追従なしに戻されるケースと、表示されずに変更可能なケースがあり、いまいち法則性が掴めていません…

Invalidated job!
UnityEngine.Debug:Log (object)
nadena.dev.modular_avatar.core.armature_lock.ArmatureLockJob:set_IsValid (bool) (at ./Packages/nadena.dev.modular-avatar/Runtime/ArmatureAwase/ArmatureLockJob.cs:66)
nadena.dev.modular_avatar.core.armature_lock.ArmatureLockOperator`1<nadena.dev.modular_avatar.core.armature_lock.OnewayArmatureLockOperator>:SingleUpdate (System.Nullable`1<int>) (at ./Packages/nadena.dev.modular-avatar/Runtime/ArmatureAwase/ArmatureLockOperator.cs:414)
nadena.dev.modular_avatar.core.armature_lock.ArmatureLockOperator`1<nadena.dev.modular_avatar.core.armature_lock.OnewayArmatureLockOperator>:InternalUpdate (System.Nullable`1<int>) (at ./Packages/nadena.dev.modular-avatar/Runtime/ArmatureAwase/ArmatureLockOperator.cs:283)
nadena.dev.modular_avatar.core.armature_lock.ArmatureLockOperator`1<nadena.dev.modular_avatar.core.armature_lock.OnewayArmatureLockOperator>:Update () (at ./Packages/nadena.dev.modular-avatar/Runtime/ArmatureAwase/ArmatureLockOperator.cs:268)
nadena.dev.modular_avatar.core.armature_lock.UpdateLoopController:Update () (at ./Packages/nadena.dev.modular-avatar/Runtime/ArmatureAwase/UpdateLoopController.cs:30)
UnityEditor.EditorApplication:Internal_CallUpdateFunctions ()

Unity 2022.3.6f1 NDMF 1.4.0 MA 1.9.12

bdunderscore commented 4 months ago

Invalidated job!は削除するべきメッセージです(いろいろと外れないケースも多いので)

Sayamame-beans commented 3 months ago

参考: Invalidated job! が表示される問題は1.9.13で修正されました。 依然として条件は不明です。

ray45422 commented 3 months ago

位置追従モードが双方向の場合、説明にもある通り、統合されるアーマチュアと統合先の位置が同じである必要があります。同じでない場合は、追従無しに戻されます。

今回の問題は片方向の場合のようで、以下の行が原因と考えられます。 https://github.com/bdunderscore/modular-avatar/blob/11abeb853b8282567a6aa948668c800370e86f16/Runtime/ArmatureAwase/ArmatureLockOperator.cs#L173 追従するボーンが増えた場合に容量を確保するようになっていますが、減った場合には必要な容量より多い配列長を確保した状態になり、削除されたTransformを含んだ配列がTransformAccessArrayに設定されます。 https://github.com/bdunderscore/modular-avatar/blob/11abeb853b8282567a6aa948668c800370e86f16/Runtime/ArmatureAwase/ArmatureLockOperator.cs#L304-L322 削除されたTransformへの参照が残っている場合、以下のチェックで_abortFlagがtrueとなり、追従無しに戻されてしまいます。同一シーン内では削除しても参照が有効なため、問題が発生しないようです。 https://github.com/bdunderscore/modular-avatar/blob/11abeb853b8282567a6aa948668c800370e86f16/Runtime/ArmatureAwase/ArmatureLockOperator.cs#L462-L466

対処法が思いつかなかったので再現手順についてまとめておきます。

  1. 位置追従モードが「追従無し」となっているMergeArmatureが設定された衣装を含むアバターを1つ配置したシーンファイルを用意します。
  2. 1と同様の方法でシーンファイルを作成します。このとき、追従対象のボーン数が1より多い衣装を使用します。
  3. 2で作成したシーンを開き、衣装のMergeArmatureの位置追従モードを「片方向」に変更します。
  4. 1で作成したシーンを開き、衣装のMergeArmatureの位置追従モードを「片方向」に変更すると、すぐに「追従無し」に戻ります。
bdunderscore commented 3 months ago

詳しい調査、ありがとうございます。確かにゴミTransformが残るとabortになりそうですね。 このissueはエラー表示の改善要望として認識しているので、上記のバグは別issueを立てます。 https://github.com/bdunderscore/modular-avatar/issues/856

Sayamame-beans commented 3 weeks ago

依然として、無言で双方向から追従なしに戻る挙動をするケースがあります