diff --git a/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10Instance.cs b/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10Instance.cs index 5ee3fc67e..c8cacae73 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10Instance.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10Instance.cs @@ -139,7 +139,18 @@ namespace UniVRM10 { // importer 内で InitializeAsync が呼び出し済み } - return new Vrm10Runtime(this, useControlRig, m_springBoneRuntime); + + var runtime = GetComponent(); + + // Vrm10Runtimeが使う初期姿勢を固定する。SpringBone や Constraint の初期姿勢になる。 + var initPose = runtime != null + // RuntimeGltfInstance があるとき => RuntimeLoad => 初期姿勢は glTF の node に由来する + ? runtime.InitialTransformStates.ToDictionary((kv) => kv.Key, (kv) => kv.Value) + // RuntimeGltfInstance が無いとき => Scene 配置の prefab など。シーンの現状を代用する。既に T-Pose でないかもしれない。 + : GetComponentsInChildren().ToDictionary(x => x, x => new TransformState(x)) + ; + + return new Vrm10Runtime(this, useControlRig, m_springBoneRuntime, initPose); } public Vrm10Runtime Runtime diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs index 3d628b13d..c6e8661e2 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs @@ -49,25 +49,21 @@ namespace UniVRM10 } } - Dictionary _initPose; + IReadOnlyDictionary _initPose; - public Vrm10Runtime(Vrm10Instance instance, bool useControlRig, IVrm10SpringBoneRuntime springBoneRuntime) + public Vrm10Runtime(Vrm10Instance instance, bool useControlRig, IVrm10SpringBoneRuntime springBoneRuntime, + IReadOnlyDictionary initPose) { if (!Application.isPlaying) { UniGLTFLogger.Warning($"{nameof(Vrm10Runtime)} expects runtime behaviour."); } - if (instance == null) - { - m_instance = null; - return; - } - if (m_instance != instance) + _initPose = initPose; + m_instance = instance; + if (m_instance == null) { - m_instance = instance; - var runtime = m_instance.GetComponent(); - _initPose = runtime.InitialTransformStates.ToDictionary((kv) => kv.Key, (kv) => kv.Value); + return; } if (!instance.TryGetBoneTransform(HumanBodyBones.Head, out m_head))