diff --git a/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectFirstPerson.cs b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectFirstPerson.cs index cb775a2fd..98de08175 100644 --- a/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectFirstPerson.cs +++ b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectFirstPerson.cs @@ -29,6 +29,9 @@ namespace UniVRM10 } } + List _created = new List(); + public IReadOnlyList Created => _created; + // If no layer names are set, use the default layer IDs. // Otherwise use the two Unity layers called "VRMFirstPersonOnly" and "VRMThirdPersonOnly". public static bool TriedSetupLayer = false; @@ -90,7 +93,7 @@ namespace UniVRM10 /// /// /// - public async Task SetupAsync(GameObject go, bool visible, IAwaitCaller awaitCaller = null) + public async Task> SetupAsync(GameObject go, IAwaitCaller awaitCaller = null) { if (awaitCaller == null) { @@ -100,7 +103,7 @@ namespace UniVRM10 SetupLayers(); if (m_done) { - return; + return Created; } m_done = true; @@ -121,9 +124,10 @@ namespace UniVRM10 // 頭を取り除いた複製モデルを作成し、1人称用にする var headless = await CreateHeadlessMeshAsync(smr, eraseBones, awaitCaller); - headless.enabled = visible; + headless.enabled = false; headless.gameObject.layer = FIRSTPERSON_ONLY_LAYER; headless.transform.SetParent(smr.transform, false); + _created.Add(headless); } else { @@ -164,6 +168,8 @@ namespace UniVRM10 break; } } + + return Created; } } } diff --git a/Assets/VRM10/Samples/VRM10FirstPersonSample/FirstPersonSample.unity b/Assets/VRM10/Samples/VRM10FirstPersonSample/VRM10FirstPersonSample.unity similarity index 99% rename from Assets/VRM10/Samples/VRM10FirstPersonSample/FirstPersonSample.unity rename to Assets/VRM10/Samples/VRM10FirstPersonSample/VRM10FirstPersonSample.unity index 77289e34c..861c7794f 100644 --- a/Assets/VRM10/Samples/VRM10FirstPersonSample/FirstPersonSample.unity +++ b/Assets/VRM10/Samples/VRM10FirstPersonSample/VRM10FirstPersonSample.unity @@ -1049,10 +1049,9 @@ MonoBehaviour: m_GameObject: {fileID: 1148284494} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 03b059a6d90275246ba8622ac40a63dc, type: 3} + m_Script: {fileID: 11500000, guid: bd151410f22d0f6409cf4b17c03a3c6e, type: 3} m_Name: m_EditorClassIdentifier: - m_loadAsync: 1 m_canvas: {fileID: 2082684588} m_faceCamera: {fileID: 1919635064} m_source: {fileID: 0} @@ -1447,7 +1446,7 @@ MonoBehaviour: m_GameObject: {fileID: 1919635062} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d1cc319f70f55264eb38d1959c4222c6, type: 3} + m_Script: {fileID: 11500000, guid: b74319fb726e30c4ca99bd741af8bd3c, type: 3} m_Name: m_EditorClassIdentifier: Target: {fileID: 0} @@ -1754,7 +1753,7 @@ MonoBehaviour: m_GameObject: {fileID: 2082684583} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1ae08a6ba07c0864c9132bc8a004030d, type: 3} + m_Script: {fileID: 11500000, guid: 58bd4ef7b3a863142ae9960c21106ba3, type: 3} m_Name: m_EditorClassIdentifier: LoadVRMButton: {fileID: 2036452539} diff --git a/Assets/VRM10/Samples/VRM10FirstPersonSample/FirstPersonSample.unity.meta b/Assets/VRM10/Samples/VRM10FirstPersonSample/VRM10FirstPersonSample.unity.meta similarity index 100% rename from Assets/VRM10/Samples/VRM10FirstPersonSample/FirstPersonSample.unity.meta rename to Assets/VRM10/Samples/VRM10FirstPersonSample/VRM10FirstPersonSample.unity.meta diff --git a/Assets/VRM10/Samples/VRM10FirstPersonSample/VRM10RuntimeLoader.cs b/Assets/VRM10/Samples/VRM10FirstPersonSample/VRM10RuntimeLoader.cs index 34a916e84..93eda34e0 100644 --- a/Assets/VRM10/Samples/VRM10FirstPersonSample/VRM10RuntimeLoader.cs +++ b/Assets/VRM10/Samples/VRM10FirstPersonSample/VRM10RuntimeLoader.cs @@ -1,4 +1,5 @@ #pragma warning disable 0414 +using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using UniGLTF; @@ -21,27 +22,23 @@ namespace UniVRM10.FirstPersonSample [SerializeField] UniHumanoid.HumanPoseTransfer m_target; - [SerializeField, Header("runtime")] - VRM10Controller m_firstPerson; - async Task SetupTargetAsync(UniHumanoid.HumanPoseTransfer m_target, bool visible) + void SetupTarget(UniHumanoid.HumanPoseTransfer m_target) { - if (m_target != null) + if (m_target == null) { - m_target.Source = m_source; - m_target.SourceType = UniHumanoid.HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseTransfer; + return; + } - m_firstPerson = m_target.GetComponent(); + m_target.Source = m_source; + m_target.SourceType = UniHumanoid.HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseTransfer; - var animator = m_target.GetComponent(); - if (animator != null) + var animator = m_target.GetComponent(); + if (animator != null) + { + if (m_faceCamera != null) { - await m_firstPerson.Vrm.FirstPerson.SetupAsync(m_firstPerson.gameObject, visible); - - if (m_faceCamera != null) - { - m_faceCamera.Target = animator.GetBoneTransform(HumanBodyBones.Head); - } + m_faceCamera.Target = animator.GetBoneTransform(HumanBodyBones.Head); } } } @@ -72,34 +69,45 @@ namespace UniVRM10.FirstPersonSample return; } - // GLB形式でJSONを取得しParseします - // VRM extension を parse します - var data = new GlbFileParser(path).Parse(); - Vrm10Data.TryParseOrMigrate(data, true, out Vrm10Data vrm); - using (var context = new Vrm10Importer(vrm)) + var instance = await LoadAsync(path); + + var root = instance.gameObject; + root.transform.SetParent(transform, false); + + // add motion + var humanPoseTransfer = root.AddComponent(); + if (m_target != null) { - // metaを取得(todo: thumbnailテクスチャのロード) - var meta = vrm.VrmExtension.Meta; - Debug.LogFormat("meta: title:{0}", meta.Name); + GameObject.Destroy(m_target.gameObject); + } + m_target = humanPoseTransfer; + SetupTarget(m_target); + } - // ParseしたJSONをシーンオブジェクトに変換していく - var loaded = await context.LoadAsync(); + async Task LoadAsync(string path) + { + var data = new GlbFileParser(path).Parse(); + if (!Vrm10Data.TryParseOrMigrate(data, true, out Vrm10Data vrm)) + { + throw new System.Exception("vrm parse error !"); + } + using (var loader = new Vrm10Importer(vrm)) + { + var instance = await loader.LoadAsync(); - var root = loaded.gameObject; - - root.transform.SetParent(transform, false); - - // add motion - var humanPoseTransfer = root.AddComponent(); - if (m_target != null) - { - GameObject.Destroy(m_target.gameObject); - } - m_target = humanPoseTransfer; - await SetupTargetAsync(m_target, visible: false); + // VR用 FirstPerson 設定 + var controller = instance.GetComponent(); + var created = await controller.Vrm.FirstPerson.SetupAsync(controller.gameObject); //メッシュを表示します - // loaded.ShowMeshes(); + foreach (var r in created) + { + // FistPerson flag = auto で生成されたモデル + r.enabled = true; + } + instance.ShowMeshes(); + + return instance; } } @@ -136,7 +144,7 @@ namespace UniVRM10.FirstPersonSample } m_source = context.Root.GetComponent(); - var task = SetupTargetAsync(m_target, true); + SetupTarget(m_target); } } }