diff --git a/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs b/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs index a9075becb..7f1a25d14 100644 --- a/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs +++ b/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs @@ -41,17 +41,26 @@ namespace VRM /// /// モデルの正規化を実行する + /// + /// v0.115 ヒエラルキーのコピーをしなくまりました(仕様変更) + /// v0.116 Animator.avatar 代入の副作用回避修正 + /// + /// v0.114以前: 非破壊 + /// - return コピーされて正規化されたヒエラルキー + /// v0.115以降: 対象のヒエラルキーが正規化されます。 + /// - Transform が変更されます。 + /// - Animator.avatar が差し替えられます。 + /// - SkinnedMeshRenderer.sharedMesh が差し替えられます。 + /// - MeshFilter.sharedMesh が差し替えられます。 + /// - return void /// /// 対象モデルのルート /// 強制的にT-Pose化するか - /// 正規化済みのモデル public static void Execute(GameObject go, bool forceTPose) { - // - // T-Poseにする - // if (forceTPose) { + // T-Poseにする var hips = go.GetComponent().GetBoneTransform(HumanBodyBones.Hips); var hipsPosition = hips.position; var hipsRotation = hips.rotation; @@ -66,16 +75,19 @@ namespace VRM } } - // Meshの焼きこみ + // Transform の回転とスケールを Mesh に適用します。 + // - 回転とスケールが反映された新しい Mesh が作成されます + // - Transform の回転とスケールはクリアされます。world position を維持します。 var newMeshMap = BoneNormalizer.NormalizeHierarchyFreezeMesh(go, true); - // 焼いたMeshで置き換える + + // SkinnedMeshRenderer.sharedMesh と MeshFilter.sharedMesh を新しいMeshで置き換える BoneNormalizer.Replace(go, newMeshMap, true, true); - // 新しいヒエラルキーからAvatarを作る + // 回転とスケールが除去された新しいヒエラルキーからAvatarを作る var animator = go.GetComponent(); var newAvatar = UniHumanoid.AvatarDescription.RecreateAvatar(animator); - // workaround: animator を作り直す + // Animator.avatar を代入したときに副作用でTransformが変更されるのを回避するために削除します。 if (Application.isPlaying) { GameObject.Destroy(animator);