diff --git a/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectFirstPerson.cs b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectFirstPerson.cs index 81d11c32ee..261f8eefec 100644 --- a/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectFirstPerson.cs +++ b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectFirstPerson.cs @@ -60,11 +60,10 @@ private async static Task CreateHeadlessMeshAsync(SkinnedMe bool m_done; - async Task SetupRendererAsync(GameObject go, Transform FirstPersonBone, RendererFirstPersonFlags x, + async Task SetupSelfRendererAsync(GameObject go, Transform FirstPersonBone, RendererFirstPersonFlags x, (int FirstPersonOnly, int ThirdPersonOnly) layer, IAwaitCaller awaitCaller = null) { var runtime = go.GetComponent(); - switch (x.FirstPersonFlag) { case UniGLTF.Extensions.VRMC_vrm.FirstPersonType.auto: @@ -127,19 +126,17 @@ async Task SetupRendererAsync(GameObject go, Transform FirstPersonBone, Renderer } /// - /// Setup first person - /// - /// * SetupLayers - /// * Each renderer is set according to the first person flag. If the flag is `auto`, headless mesh creation will be performed. It's a heavy process. - /// * If visible is false, the created headless mesh will be hidden. - /// + /// Each renderer is set according to the first person flag. + /// If the flag is `auto`, headless mesh creation will be performed. + /// Creating a headless mesh(Renderer) is a heavy process and can be done in threads. /// - /// - /// - /// - /// + /// The target model root + /// The target model is the VR user himself + /// layer VRMFirstPersonOnly or 9 + /// layer VRMThirdPersonOnly ir 10 + /// Headless mesh creation task scheduler. By default, creation is immediate /// - public async Task SetupAsync(GameObject go, int? firstPersonOnlyLayer = default, int? thirdPersonOnlyLayer = default, IAwaitCaller awaitCaller = default) + public async Task SetupAsync(GameObject go, bool isSelf = true, int? firstPersonOnlyLayer = default, int? thirdPersonOnlyLayer = default, IAwaitCaller awaitCaller = default) { if (awaitCaller == null) { @@ -159,7 +156,30 @@ public async Task SetupAsync(GameObject go, int? firstPersonOnlyLayer = default, var FirstPersonBone = go.GetComponent().GetBoneTransform(HumanBodyBones.Head); foreach (var x in Renderers) { - await SetupRendererAsync(go, FirstPersonBone, x, layer, awaitCaller); + if (isSelf) + { + await SetupSelfRendererAsync(go, FirstPersonBone, x, layer, awaitCaller); + } + else + { + switch (x.FirstPersonFlag) + { + case UniGLTF.Extensions.VRMC_vrm.FirstPersonType.firstPersonOnly: + if (x.GetRenderer(go.transform) is Renderer r) + { + // invisible + r.enabled = false; + } + break; + + case UniGLTF.Extensions.VRMC_vrm.FirstPersonType.auto: + // => Same as Both + case UniGLTF.Extensions.VRMC_vrm.FirstPersonType.both: + case UniGLTF.Extensions.VRMC_vrm.FirstPersonType.thirdPersonOnly: + // do nothing + break; + } + } } } }