From 3727eee6004aed4fd82cf91af856b6d4a4e080a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ansis=20M=C4=81li=C5=86=C5=A1?= Date: Thu, 8 Jan 2026 21:20:35 +0100 Subject: [PATCH] Fix RebuildHumanAvatar so it works in play mode --- Packages/UniGLTF/Runtime/UniHumanoid/HumanoidLoader.cs | 8 +++++++- .../VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs | 7 +++++-- 2 files changed, 12 insertions(+), 3 deletions(-) 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); } }