Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SkinnedMeshRendererのenableを切り替えるアニメーションのみがあり、初期で無効な場合、Trace & Optimizeの「スキンメッシュレンダラーを統合する」が統合したメッシュが削除される #1377

Closed
Narazaka opened this issue Jan 2, 2025 · 27 comments · Fixed by #1381

Comments

@Narazaka
Copy link
Contributor

Narazaka commented Jan 2, 2025

AAO 1.8.2, 1.8.3

胸サイズ変更に連動して衣装の大小対応を動的に切り替えるために、SkinnedMeshRendererのenableを切り替える手法を使用しました。

  • SkinnedMeshRendererのenableのみが切り替わる(GameObjectのactiveは切り替わらない)

image

といった設定がある状態で

「スキンメッシュレンダラーを統合する」をONにすると、enableが違う状態のアニメーションがあるにもかかわらずSkinnedMeshRendererが統合・削除されてしまい、OFF時と挙動が異なります(アニメーションによってenableになるSkinnedMeshRendererが削除されてしまう状態です)。

上記のスクショは簡単のためAvatar Menu Creatorのコンポーネントですが、ビルド時生成でなく事前生成してMAでくっつけても同様でした。(いちおうprefab添付)
aaoissue.zip

一般にはGameObjectで表示制御を行うものとは思いますが、「服のON/OFF」と「体型によるメッシュスイッチ」を同時に行う場合、「服のON/OFF」をGameObjectのactiveで、「体型によるメッシュスイッチ」をenableで行うと簡易的に共存出来るためこの方針が発生します。
今回この事例において「服のON/OFF」を実装する前にテストしたことで発生しました(「服のON/OFF」、つまり同メッシュに対するGameObjectのactive制御が含まれると正常に動作しました)。

@anatawa12
Copy link
Owner

anatawa12 commented Jan 3, 2025

m_Enabledの切り替えアニメーションを手動で Animation Window で作成し、FXに入れて試したたところ再現しませんでした。

@Narazaka
Copy link
Contributor Author

Narazaka commented Jan 3, 2025

  • Enableを切り替えるアニメーションのはずが、マージされたメッシュのActiveを変えるものに変更されます。
  • Manual Bakeしても再現しました。
  • MAとTrace & Optimizeと当該アニメーションのみ動作するようにオブジェクトやコンポーネントを消しても再現しました。
  • 新規プロジェクトを作成し、別モデルで検証しました。
    • 再現しません。ただし見た目上正常動作しましたが、SkinendMeshのEnableを扱ったのに部分的にマージされたメッシュはActiveを切り替えるアニメーションに差し替えられていました。(想定挙動かも)
    • 当該プロジェクトはこちらです。 https://github.com/Narazaka/aao-bug-prj
  • 操作する設定を変更すると以下のようになりました。
    • 再現した事例
      • 各stateでEnableにするメッシュを同一階層(衣装プレハブルート内)で別のものにするが、別ステートで同じポリゴン数の別メッシュを選択する
        • 例: Raincoat_big, Raincoat_midと他の2メッシュを選択
      • 取り得るstateを3から2にする
    • 再現しなかった事例
      • 各stateでEnableにするメッシュを同一階層(衣装プレハブルート内)で別のものにするが、別ステートで別のポリゴン数の別メッシュを選択する
        • 例: Raincoat_big, Raincoat_smallと他の2メッシュを選択
      • 各stateでEnableにするメッシュを別階層を含む(衣装プレハブルート内とアバター標準衣装)で別のものにする
      • 各stateでEnableにするメッシュは2つ(レインコート及びビキニそれぞれのbig, mid, small)あるのですが、これを各stateで1つにする。
    • このときベースモデルは、セレスティア最新版 https://booth.pm/ja/items/4035411 、衣装はレインコートビキニ最新版セレスティア用 https://booth.pm/ja/items/4862575 でした。
      • 衣装は胸サイズのbig, mid, smallに応じてほぼ同形状の別メッシュを1つのFBXに用意して切り替える方式です。
      • 同じポリゴン数の別メッシュを別ステートで選択し、かつそれとは別のメッシュも同時に切り替えるときに再現するようです?
        image

@anatawa12
Copy link
Owner

再現した例の、 Animator Parser Debug Window V2で取得した Detailed なパース結果と、切り替えるアニメーションの名前を教えていただけませんか?

@Narazaka
Copy link
Contributor Author

Narazaka commented Jan 9, 2025

  • rebased RaincoatSize_0: 本来Raincoat_big, RCB_bikini_bigのSkinnedMeshをON
  • rebased RaincoatSize_1: 本来Raincoat_mid, RCB_bikini_midのSkinnedMeshをON
  • rebased RaincoatSize_2: 本来Raincoat_small, RCB_bikini_smallのSkinnedMeshをON

レイヤーはこんな感じです(Avatar Menu Creatorで作られるものです。idleステートおよびAnyStateからRaincoatSize変数が0, 1, 2の時に各ステートに遷移するものです)
image

「スキンメッシュレンダラーを統合する」OFF
detailed_without_merge.txt

「スキンメッシュレンダラーを統合する」ON
detailed.txt

@anatawa12
Copy link
Owner

アニメーション自体は認知されていて、原因がわからなくなりましたね...

発生条件が

同じポリゴン数の別メッシュ

となってますが、メッシュアセットを差し替えるなどしてポリゴン数を変化させても発生しますか?

@Narazaka
Copy link
Contributor Author

はい、上記では同じポリゴン数のメッシュとしていましたが、同一FBX内の別メッシュを持ってきても発生しました。

@Narazaka
Copy link
Contributor Author

別FBXだとbonesの再割り当てが必要になると思われるため(最初から表示されないため)テストしませんでした。

@anatawa12
Copy link
Owner

ありがとうございます。そして何度もすみません。とりあえずメッシュのポリ数自体によるものではなさそうですかね。

もう2つ確認させてください。

Trace and OptimizeのDebug OptionsのSkip Merge Animating Skinned MeshとSkip Merge Static Skinned Meshを有効にしてマージされないかどうかの確認を、それぞれ一つづつ有効にして確認していただきたいです。

確認用にAAOを拡張したのでこれを使用して確認をお願いします。

2.1. Packages/AvatarOptimizer/Editor/Processors/TraceAndOptimize/AutoMergeSkinnedMesh.csPackages/AvatarOptimizer/Editor/Utils/AnimationLocation.csをそれぞれこのzipの中のものに置き換えてください。aao-key-test.zip
2.2. Tools/Avatar Optimizer/CategorizationKey Debugを有効にしてください
2.3. 該当のアバターをManual Bake Avatarしてください。
2.4. 以下の二点の確認をお願いします。
2.4.1. CategorizationKeyが同一扱いになっているか
2.4.1.1. Manual Bake Avatarを行うと、アバターのルートにCategorizationKeyHolderRootというコンポーネントが追加されています。このinspectorにCompare Two Keysというのがあるため、ここで誤ってマージされてしまうペアでCompareしてその結果を教えて下さい。
2.4.1.2. Save to fileをクリックして、.assetファイルに保存し、それを私に送信してください。

なお、このツールはAssembly Reloadの耐性がないため、2.2以降でUnityの再起動やツールの更新などを行った際には2.2からやり直すようにお願いします。

@Narazaka
Copy link
Contributor Author

@anatawa12
このようなエラーが出て実行不能です。
image

@anatawa12
Copy link
Owner

ごめんなさい。ベースとするブランチを間違ってたようです。あとで修正版を送信します。

@anatawa12
Copy link
Owner

こちらでお願いします。
AutoMergeSkinnedMesh.cs.zip

@Narazaka
Copy link
Contributor Author

  • Skip Merge Animating Skinned Mesh有効: マージされず、正常に動作しました
  • Skip Merge Static Skinned Mesh有効: マージされ、上記のバグの状態になりました。

@Narazaka
Copy link
Contributor Author

ここで誤ってマージされてしまうペアでCompareしてその結果を

あまりどうすれば良いか自明でなかったので一旦こんな感じで

image
image
image
image
image
image
image
image
image

CategorizationKey.zip

@anatawa12
Copy link
Owner

ありがとうございます。

うーん _mid _small _big の間の2つにおいて are same と表示されると期待してたのですがないですね...
マージされるときは same な間になるように作ってるので

@anatawa12
Copy link
Owner

anatawa12 commented Jan 15, 2025

こちらのバージョンにAutoMergeSkinnedMesh.csを置き換えて、デバッグオプションを無効な状態で、ビルドを実行したさいのログを送信していただきたいです。調査のためのログを追加しました。

AutoMergeSkinnedMesh.cs.zip
(tag)

@Narazaka
Copy link
Contributor Author

@anatawa12
ビルドとはManual Bakeですか?

@anatawa12
Copy link
Owner

Manual Bake、Playモード、Uploadいずれでも問題ないですが、Manual Bakeでお願いします

@Narazaka
Copy link
Contributor Author

@anatawa12
どこかにログファイルが吐かれるわけではなく、UnityEditorの標準ログを切り出してくる必要あります?

@anatawa12
Copy link
Owner

UnityEditorの標準のログに出力されます。分かりづらくてすみません。

@Narazaka
Copy link
Contributor Author

なんか切り出す便利なツールとかあるんでしょうか

@Narazaka
Copy link
Contributor Author

@anatawa12
雰囲気で切り出したやつです
mblog.txt

@anatawa12
Copy link
Owner

ありがとうございます。(課題やってて一旦見てなかったです)

https://github.com/anatawa12/ConsoleLogSaver とかが一応使えたと思います。

@anatawa12
Copy link
Owner

ログを見る限りですと Raincoat_small と RCB_bikini_small のように同じタイミングでオン・オフされているオブジェクト同士のみ結合されている用に見えますが、このログを取得した際にはバグは再現しましたでしょうか。

@Narazaka
Copy link
Contributor Author

はい。再現しています。
image
気づいたのですが、結合後のメッシュが上記のようにRaincoart_big__Big breasts等のbig系から引き継いだと思わしきblendshapeのみを保持しています。
mid, smallは結合後削除されているのではないでしょうか。
このアニメーションの初期状態にあわせて、初期状態ではmid, smallはそれぞれSkinnedMeshRendererのenableはfalse(チェックが外れた状態)です。(言及していたと思っていましたが、きちんと書いていませんでした。)
なのでその初期状態を誤認して削除している等が考えられないでしょうか。

@anatawa12
Copy link
Owner

6つのメッシュが表示状態で重なってしまうものだと認識してました。そうではなくbigのメッシュのみ表示されていたということですね。
確認が十分でなくすみません。

そして enabled を無効にした状態で Play モードに入るとマージされた _mid _small のメッシュが削除されることを再現しました。

@anatawa12 anatawa12 changed the title SkinnedMeshRendererのenableを切り替えるアニメーションのみがある場合、Trace & Optimizeの「スキンメッシュレンダラーを統合する」がそれを考慮しないで統合してしまう。 SkinnedMeshRendererのenableを切り替えるアニメーションのみがあり、初期で無効な場合、Trace & Optimizeの「スキンメッシュレンダラーを統合する」が統合したメッシュが削除される Jan 16, 2025
@anatawa12
Copy link
Owner

確認のため、 Trace and Optimize の GC Debug を有効にするとマージ済のメッシュが3つ並ぶことを確認していただきたいです。

Image

@anatawa12
Copy link
Owner

多分 #1381 で治ったのでCloseします。

上の確認が取れ次第リリースしようと思います。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants