diff --git a/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10Instance.cs b/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10Instance.cs
index dd90a264a..2134ec5cb 100644
--- a/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10Instance.cs
+++ b/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10Instance.cs
@@ -115,31 +115,49 @@ namespace UniVRM10
}
}
+ ///
+ /// SpringboneRuntime が無かった時にデフォルトの runtime を作成する
+ ///
+ /// - Importer に SpringboneRuntime 引数が無かった時
+ /// - Scene 配置 model のスタートアップ
+ ///
+ ///
+ ///
+ ///
+ internal static IVrm10SpringBoneRuntime MakeSpringboneRuntime(GameObject root)
+ {
+ if (root != null)
+ {
+ var provider = root.GetComponent();
+ if (provider != null)
+ {
+ // 明示的カスタマイズ
+ return provider.CreateSpringBoneRuntime();
+ }
+ }
+
+ if (Application.isEditor)
+ {
+ // note: test, timeline などで Singleton(DontDestroyOnLoad) が都合が悪い
+ return new Vrm10FastSpringboneRuntimeStandalone();
+ }
+
+ // default
+ return new Vrm10FastSpringboneRuntime();
+ }
+
internal Vrm10Runtime MakeRuntime(bool useControlRig)
{
if (m_springBoneRuntime == null)
{
- // シーン配置モデルが play された
- var provider = GetComponent();
- if (provider != null)
- {
- // 明示的カスタマイズ
- m_springBoneRuntime = provider.CreateSpringBoneRuntime();
- }
- else
- {
- // deafult に fallback
- if (Application.isEditor)
- {
- m_springBoneRuntime = new Vrm10FastSpringboneRuntimeStandalone();
- }
- else
- {
- m_springBoneRuntime = new Vrm10FastSpringboneRuntime();
- }
- }
+ // springbone が無い => シーン配置モデルが play されたと見做す
+ m_springBoneRuntime = MakeSpringboneRuntime(gameObject);
m_springBoneRuntime.InitializeAsync(this, new ImmediateCaller());
}
+ else
+ {
+ // importer 内で InitializeAsync が呼び出し済み
+ }
return new Vrm10Runtime(this, useControlRig, m_springBoneRuntime);
}
diff --git a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs
index c3c05ff38..9e56a7366 100644
--- a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs
+++ b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs
@@ -54,24 +54,20 @@ namespace UniVRM10
m_externalMap = new Dictionary();
}
- m_springboneRuntime = MakeDefaultRuntime(springboneRuntime, isAssetImport);
- }
-
- static IVrm10SpringBoneRuntime MakeDefaultRuntime(IVrm10SpringBoneRuntime runtime, bool isAssetImport)
- {
- if (runtime != null)
+ if (springboneRuntime == null)
{
- return runtime;
+ if (isAssetImport)
+ {
+ // 何もしない dummy
+ springboneRuntime = new Vrm10NopSpringboneRuntime();
+ }
+ else
+ {
+ // default の SpringboneRuntime を作成する
+ springboneRuntime = Vrm10Instance.MakeSpringboneRuntime(null);
+ }
}
-
- if (isAssetImport)
- {
- // 何もしない dummy
- return new Vrm10NopSpringboneRuntime();
- }
-
- // Vrm10Instance.MakeRuntime に移譲
- return null;
+ m_springboneRuntime = springboneRuntime;
}
static void AssignHumanoid(List nodes, UniGLTF.Extensions.VRMC_vrm.HumanBone humanBone, VrmLib.HumanoidBones key)