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);
}
}