From 3b3756af898dc5d2ac7e49aa4b3decf79f7ef647 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 26 Feb 2026 23:32:43 +0900 Subject: [PATCH] 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); } }