From 43bad5636faad82fdb3f93655733b15aed260be4 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 26 Feb 2026 23:12:43 +0900 Subject: [PATCH 1/3] mv AwaitCaller to UniGLTF.Utils --- .../UniGLTF/Runtime/{UniGLTF/IO => Utils}/AwaitCaller.meta | 0 .../Runtime/{UniGLTF/IO => Utils}/AwaitCaller/IAwaitCaller.cs | 0 .../{UniGLTF/IO => Utils}/AwaitCaller/IAwaitCaller.cs.meta | 0 .../{UniGLTF/IO => Utils}/AwaitCaller/ImmediateCaller.cs | 0 .../{UniGLTF/IO => Utils}/AwaitCaller/ImmediateCaller.cs.meta | 0 .../IO => Utils}/AwaitCaller/NextFrameTaskScheduler.cs | 0 .../IO => Utils}/AwaitCaller/NextFrameTaskScheduler.cs.meta | 0 .../IO => Utils}/AwaitCaller/RuntimeOnlyAwaitCaller.cs | 0 .../IO => Utils}/AwaitCaller/RuntimeOnlyAwaitCaller.cs.meta | 0 .../AwaitCaller/RuntimeOnlyNoThreadAwaitCaller.cs | 0 .../AwaitCaller/RuntimeOnlyNoThreadAwaitCaller.cs.meta | 0 .../IO => Utils}/AwaitCaller/TinyManagedTaskScheduler.cs | 0 .../IO => Utils}/AwaitCaller/TinyManagedTaskScheduler.cs.meta | 0 Packages/VRM/Tests/VRM.Tests.asmdef | 4 ++-- Packages/VRM10/Tests/VRM10.Tests.asmdef | 4 ++-- 15 files changed, 4 insertions(+), 4 deletions(-) rename Packages/UniGLTF/Runtime/{UniGLTF/IO => Utils}/AwaitCaller.meta (100%) rename Packages/UniGLTF/Runtime/{UniGLTF/IO => Utils}/AwaitCaller/IAwaitCaller.cs (100%) rename Packages/UniGLTF/Runtime/{UniGLTF/IO => Utils}/AwaitCaller/IAwaitCaller.cs.meta (100%) rename Packages/UniGLTF/Runtime/{UniGLTF/IO => Utils}/AwaitCaller/ImmediateCaller.cs (100%) rename Packages/UniGLTF/Runtime/{UniGLTF/IO => Utils}/AwaitCaller/ImmediateCaller.cs.meta (100%) rename Packages/UniGLTF/Runtime/{UniGLTF/IO => Utils}/AwaitCaller/NextFrameTaskScheduler.cs (100%) rename Packages/UniGLTF/Runtime/{UniGLTF/IO => Utils}/AwaitCaller/NextFrameTaskScheduler.cs.meta (100%) rename Packages/UniGLTF/Runtime/{UniGLTF/IO => Utils}/AwaitCaller/RuntimeOnlyAwaitCaller.cs (100%) rename Packages/UniGLTF/Runtime/{UniGLTF/IO => Utils}/AwaitCaller/RuntimeOnlyAwaitCaller.cs.meta (100%) rename Packages/UniGLTF/Runtime/{UniGLTF/IO => Utils}/AwaitCaller/RuntimeOnlyNoThreadAwaitCaller.cs (100%) rename Packages/UniGLTF/Runtime/{UniGLTF/IO => Utils}/AwaitCaller/RuntimeOnlyNoThreadAwaitCaller.cs.meta (100%) rename Packages/UniGLTF/Runtime/{UniGLTF/IO => Utils}/AwaitCaller/TinyManagedTaskScheduler.cs (100%) rename Packages/UniGLTF/Runtime/{UniGLTF/IO => Utils}/AwaitCaller/TinyManagedTaskScheduler.cs.meta (100%) diff --git a/Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller.meta b/Packages/UniGLTF/Runtime/Utils/AwaitCaller.meta similarity index 100% rename from Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller.meta rename to Packages/UniGLTF/Runtime/Utils/AwaitCaller.meta diff --git a/Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/IAwaitCaller.cs b/Packages/UniGLTF/Runtime/Utils/AwaitCaller/IAwaitCaller.cs similarity index 100% rename from Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/IAwaitCaller.cs rename to Packages/UniGLTF/Runtime/Utils/AwaitCaller/IAwaitCaller.cs diff --git a/Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/IAwaitCaller.cs.meta b/Packages/UniGLTF/Runtime/Utils/AwaitCaller/IAwaitCaller.cs.meta similarity index 100% rename from Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/IAwaitCaller.cs.meta rename to Packages/UniGLTF/Runtime/Utils/AwaitCaller/IAwaitCaller.cs.meta diff --git a/Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/ImmediateCaller.cs b/Packages/UniGLTF/Runtime/Utils/AwaitCaller/ImmediateCaller.cs similarity index 100% rename from Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/ImmediateCaller.cs rename to Packages/UniGLTF/Runtime/Utils/AwaitCaller/ImmediateCaller.cs diff --git a/Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/ImmediateCaller.cs.meta b/Packages/UniGLTF/Runtime/Utils/AwaitCaller/ImmediateCaller.cs.meta similarity index 100% rename from Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/ImmediateCaller.cs.meta rename to Packages/UniGLTF/Runtime/Utils/AwaitCaller/ImmediateCaller.cs.meta diff --git a/Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/NextFrameTaskScheduler.cs b/Packages/UniGLTF/Runtime/Utils/AwaitCaller/NextFrameTaskScheduler.cs similarity index 100% rename from Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/NextFrameTaskScheduler.cs rename to Packages/UniGLTF/Runtime/Utils/AwaitCaller/NextFrameTaskScheduler.cs diff --git a/Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/NextFrameTaskScheduler.cs.meta b/Packages/UniGLTF/Runtime/Utils/AwaitCaller/NextFrameTaskScheduler.cs.meta similarity index 100% rename from Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/NextFrameTaskScheduler.cs.meta rename to Packages/UniGLTF/Runtime/Utils/AwaitCaller/NextFrameTaskScheduler.cs.meta diff --git a/Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/RuntimeOnlyAwaitCaller.cs b/Packages/UniGLTF/Runtime/Utils/AwaitCaller/RuntimeOnlyAwaitCaller.cs similarity index 100% rename from Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/RuntimeOnlyAwaitCaller.cs rename to Packages/UniGLTF/Runtime/Utils/AwaitCaller/RuntimeOnlyAwaitCaller.cs diff --git a/Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/RuntimeOnlyAwaitCaller.cs.meta b/Packages/UniGLTF/Runtime/Utils/AwaitCaller/RuntimeOnlyAwaitCaller.cs.meta similarity index 100% rename from Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/RuntimeOnlyAwaitCaller.cs.meta rename to Packages/UniGLTF/Runtime/Utils/AwaitCaller/RuntimeOnlyAwaitCaller.cs.meta diff --git a/Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/RuntimeOnlyNoThreadAwaitCaller.cs b/Packages/UniGLTF/Runtime/Utils/AwaitCaller/RuntimeOnlyNoThreadAwaitCaller.cs similarity index 100% rename from Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/RuntimeOnlyNoThreadAwaitCaller.cs rename to Packages/UniGLTF/Runtime/Utils/AwaitCaller/RuntimeOnlyNoThreadAwaitCaller.cs diff --git a/Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/RuntimeOnlyNoThreadAwaitCaller.cs.meta b/Packages/UniGLTF/Runtime/Utils/AwaitCaller/RuntimeOnlyNoThreadAwaitCaller.cs.meta similarity index 100% rename from Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/RuntimeOnlyNoThreadAwaitCaller.cs.meta rename to Packages/UniGLTF/Runtime/Utils/AwaitCaller/RuntimeOnlyNoThreadAwaitCaller.cs.meta diff --git a/Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/TinyManagedTaskScheduler.cs b/Packages/UniGLTF/Runtime/Utils/AwaitCaller/TinyManagedTaskScheduler.cs similarity index 100% rename from Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/TinyManagedTaskScheduler.cs rename to Packages/UniGLTF/Runtime/Utils/AwaitCaller/TinyManagedTaskScheduler.cs diff --git a/Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/TinyManagedTaskScheduler.cs.meta b/Packages/UniGLTF/Runtime/Utils/AwaitCaller/TinyManagedTaskScheduler.cs.meta similarity index 100% rename from Packages/UniGLTF/Runtime/UniGLTF/IO/AwaitCaller/TinyManagedTaskScheduler.cs.meta rename to Packages/UniGLTF/Runtime/Utils/AwaitCaller/TinyManagedTaskScheduler.cs.meta diff --git a/Packages/VRM/Tests/VRM.Tests.asmdef b/Packages/VRM/Tests/VRM.Tests.asmdef index 5d30901d9..4b755ecfd 100644 --- a/Packages/VRM/Tests/VRM.Tests.asmdef +++ b/Packages/VRM/Tests/VRM.Tests.asmdef @@ -7,9 +7,9 @@ "GUID:8d76e605759c3f64a957d63ef96ada7c", "GUID:5f875fdc81c40184c8333b9d63c6ddd5", "GUID:f9fe54bb3090be448aa10ac92648a614", - "GUID:da3e51d19d51a544fa14d43fee843098", "GUID:27619889b8ba8c24980f49ee34dbb44a", - "GUID:0acc523941302664db1f4e527237feb3" + "GUID:0acc523941302664db1f4e527237feb3", + "GUID:1cd941934d098654fa21a13f28346412" ], "includePlatforms": [ "Editor" diff --git a/Packages/VRM10/Tests/VRM10.Tests.asmdef b/Packages/VRM10/Tests/VRM10.Tests.asmdef index afe244664..2a71a7b8b 100644 --- a/Packages/VRM10/Tests/VRM10.Tests.asmdef +++ b/Packages/VRM10/Tests/VRM10.Tests.asmdef @@ -7,9 +7,9 @@ "GUID:8d76e605759c3f64a957d63ef96ada7c", "GUID:5f875fdc81c40184c8333b9d63c6ddd5", "GUID:f9fe54bb3090be448aa10ac92648a614", - "GUID:da3e51d19d51a544fa14d43fee843098", "GUID:27619889b8ba8c24980f49ee34dbb44a", - "GUID:0acc523941302664db1f4e527237feb3" + "GUID:0acc523941302664db1f4e527237feb3", + "GUID:1cd941934d098654fa21a13f28346412" ], "includePlatforms": [ "Editor" From 3b3756af898dc5d2ac7e49aa4b3decf79f7ef647 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 26 Feb 2026 23:32:43 +0900 Subject: [PATCH 2/3] Fix compilation error due to Awaitable not being referenced. Use IAwaitable with no external dependencies. --- .../Runtime/UniHumanoid/HumanoidLoader.cs | 27 ++++++++++++------- .../SkinnedMeshUtility/VRMBoneNormalizer.cs | 14 ++++++---- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/Packages/UniGLTF/Runtime/UniHumanoid/HumanoidLoader.cs b/Packages/UniGLTF/Runtime/UniHumanoid/HumanoidLoader.cs index db3b5329d..d118f2caa 100644 --- a/Packages/UniGLTF/Runtime/UniHumanoid/HumanoidLoader.cs +++ b/Packages/UniGLTF/Runtime/UniHumanoid/HumanoidLoader.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; +using UniGLTF; using UniGLTF.Utils; using UnityEngine; @@ -51,14 +53,16 @@ namespace UniHumanoid x => x); /// - /// Avatar を保持する既存の Animatorヒエラルキーの Transform を変更したのちに、 - /// HumanBone のマッピングを流用して、新たな Avatar を作り直す。 - /// 古い Avatar は破棄する。 + /// Recreates an animiator's humanoid avatar. + /// The old Avatar is discarded. /// - /// - /// This method runs asynchronously only in play mode. - /// - public static async Awaitable RebuildHumanAvatar(Animator animator) + public static void RebuildHumanAvatar(Animator animator) + { + var task = RebuildHumanAvatarAsync(animator, new ImmediateCaller()); + task.Wait(); + } + + public static async Task RebuildHumanAvatarAsync(Animator animator, IAwaitCaller awaitCaller) { if (animator == null) { @@ -76,19 +80,22 @@ namespace UniHumanoid newAvatar.name = "re-created"; // var newAvatar = LoadHumanoidAvatarFromAnimator(animator); - // Animator.avatar を代入したときに副作用でTransformが変更されるのを回避するために削除します。 + // 1. Delete this to avoid changing Transform as a side effect when assigning Animator.avatar. if (Application.isPlaying) { GameObject.Destroy(animator); + // https://github.com/vrm-c/UniVRM/pull/2764 + // Require IAwaitCaller that has NextFrame capability. RuntimeOnlyAwaitCaller etc. not ImmediateCaller. // Else, the following AddComponent call will fail. - await Awaitable.NextFrameAsync(); + await awaitCaller.NextFrame(); } else { GameObject.DestroyImmediate(animator); } - // 新たに AddComponent する + + // 2. Attach a new one target.AddComponent().avatar = newAvatar; } } diff --git a/Packages/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs b/Packages/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs index 5d0762c06..c03838d28 100644 --- a/Packages/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs +++ b/Packages/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using UniGLTF; using UniGLTF.MeshUtility; using UniGLTF.Utils; @@ -53,10 +54,13 @@ namespace VRM /// 対象モデルのルート /// 強制的にT-Pose化するか /// BlendShape の現状をbakeするか - /// - /// This method runs asynchronously only in play mode. - /// - public static async Awaitable Execute(GameObject go, bool forceTPose, bool useCurrentBlendShapeWeight) + public static void Execute(GameObject go, bool forceTPose, bool useCurrentBlendShapeWeight) + { + var task = ExecuteAsync(go, forceTPose, useCurrentBlendShapeWeight, new ImmediateCaller()); + task.Wait(); + } + + public static async Task ExecuteAsync(GameObject go, bool forceTPose, bool useCurrentBlendShapeWeight, IAwaitCaller awaitCaller) { if (forceTPose) { @@ -86,7 +90,7 @@ namespace VRM // 回転とスケールが除去された新しいヒエラルキーからAvatarを作る if (go.TryGetComponent(out var animator)) { - await HumanoidLoader.RebuildHumanAvatar(animator); + await HumanoidLoader.RebuildHumanAvatarAsync(animator, awaitCaller); } } From 5af97a569e35e6fc63f9e176e36ddb36ba9bcac0 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 26 Feb 2026 23:57:20 +0900 Subject: [PATCH 3/3] throw if not IsCompleted --- Packages/UniGLTF/Runtime/UniHumanoid/HumanoidLoader.cs | 5 ++++- Packages/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Packages/UniGLTF/Runtime/UniHumanoid/HumanoidLoader.cs b/Packages/UniGLTF/Runtime/UniHumanoid/HumanoidLoader.cs index d118f2caa..77c68c458 100644 --- a/Packages/UniGLTF/Runtime/UniHumanoid/HumanoidLoader.cs +++ b/Packages/UniGLTF/Runtime/UniHumanoid/HumanoidLoader.cs @@ -59,7 +59,10 @@ namespace UniHumanoid public static void RebuildHumanAvatar(Animator animator) { var task = RebuildHumanAvatarAsync(animator, new ImmediateCaller()); - task.Wait(); + if (!task.IsCompleted) + { + throw new Exception("task not completed"); + } } public static async Task RebuildHumanAvatarAsync(Animator animator, IAwaitCaller awaitCaller) diff --git a/Packages/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs b/Packages/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs index c03838d28..ec0b8bf09 100644 --- a/Packages/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs +++ b/Packages/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs @@ -57,7 +57,10 @@ namespace VRM public static void Execute(GameObject go, bool forceTPose, bool useCurrentBlendShapeWeight) { var task = ExecuteAsync(go, forceTPose, useCurrentBlendShapeWeight, new ImmediateCaller()); - task.Wait(); + if (!task.IsCompleted) + { + throw new Exception("task not completed"); + } } public static async Task ExecuteAsync(GameObject go, bool forceTPose, bool useCurrentBlendShapeWeight, IAwaitCaller awaitCaller)