anatawa12 / AvatarOptimizer

AAO: Avatar Optimizer: Non Destructive Avatar Optimization Utilities
MIT License
180 stars 24 forks source link

Remove Mesh in Box 動的生成時にプレイモードとビルド時でBoxesの初期値が異なる #1214

Closed Tatamo closed 2 weeks ago

Tatamo commented 2 weeks ago

現象・再現方法

Remove Mesh in Box が付与されていないGameObject targetObject に対して以下のようにコンポーネントを生成します。

removeMeshInBox = targetObject.AddComponent<RemoveMeshInBox>();
removeMeshInBox.Initialize(1);
Debug.Log($"boxes size: {removeMeshInBox.Boxes.Length}");

上記のコードを NDMF Plugin として InPhase(BuildPhase.Generating).Run(...) のパスで実行すると、 プレイモードに入った際はBoxesのサイズが0で、VRChat SDKのBuild & Testでアバターをビルドしたり、Modular AvatarのManual Bake Avatarを実行した際はDefaultのBoxが入っていてサイズが1です。

問題点

プレイモードでの動作確認とビルド時で挙動が異なるので、プレイモードで動作確認してBoxesに何も入らないものと考えて実際にビルドすると、Center: (0, 0, 0), Size: (1, 1, 1) の領域のメッシュが意図せずに削除される結果を招きます。

望ましい動作

プレイモードに入ったときとビルド時でAddComponentによって生成されたRemoveMeshInBoxが同じ値を持つ。

ワークアラウンド

removeMeshInBox = targetObject.AddComponent<RemoveMeshInBox>();
removeMeshInBox.Initialize(1);
if (removeMeshInBox.Boxes.Length > 0)
{
    removeMeshInBox.Boxes = Array.Empty<RemoveMeshInBox.BoundingBox>();
}
...
anatawa12 commented 2 weeks ago

Initializeで吸収するつもりの差異が残っちゃってますね。ありがとうございます。

Resetの状態=build時にが意図しているので、ボックスが一つある状態を正とします。

anatawa12 commented 2 weeks ago

v1.7.13-beta.2 で修正できたと思います。確認お願いします。

Tatamo commented 2 weeks ago

確認できました!ありがとうございます。