diff --git a/Packages/UniGLTF/Runtime/UniHumanoid/HumanoidLoader.cs b/Packages/UniGLTF/Runtime/UniHumanoid/HumanoidLoader.cs index 61f07d70b..db3b5329d 100644 --- a/Packages/UniGLTF/Runtime/UniHumanoid/HumanoidLoader.cs +++ b/Packages/UniGLTF/Runtime/UniHumanoid/HumanoidLoader.cs @@ -55,7 +55,10 @@ namespace UniHumanoid /// HumanBone のマッピングを流用して、新たな Avatar を作り直す。 /// 古い Avatar は破棄する。 /// - public static void RebuildHumanAvatar(Animator animator) + /// + /// This method runs asynchronously only in play mode. + /// + public static async Awaitable RebuildHumanAvatar(Animator animator) { if (animator == null) { @@ -77,6 +80,9 @@ namespace UniHumanoid if (Application.isPlaying) { GameObject.Destroy(animator); + + // Else, the following AddComponent call will fail. + await Awaitable.NextFrameAsync(); } else { diff --git a/Packages/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs b/Packages/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs index 77269756d..5d0762c06 100644 --- a/Packages/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs +++ b/Packages/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs @@ -53,7 +53,10 @@ namespace VRM /// 対象モデルのルート /// 強制的にT-Pose化するか /// BlendShape の現状をbakeするか - public static void Execute(GameObject go, bool forceTPose, bool useCurrentBlendShapeWeight) + /// + /// This method runs asynchronously only in play mode. + /// + public static async Awaitable Execute(GameObject go, bool forceTPose, bool useCurrentBlendShapeWeight) { if (forceTPose) { @@ -83,7 +86,7 @@ namespace VRM // 回転とスケールが除去された新しいヒエラルキーからAvatarを作る if (go.TryGetComponent(out var animator)) { - HumanoidLoader.RebuildHumanAvatar(animator); + await HumanoidLoader.RebuildHumanAvatar(animator); } }