From 03e9cfb43e8568ab0940a8baafbeb54079a838b5 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Mon, 25 May 2020 18:31:13 +0900 Subject: [PATCH] =?UTF-8?q?=E5=89=8A=E9=99=A4=E5=AF=BE=E8=B1=A1=E3=81=AE?= =?UTF-8?q?=E3=83=9C=E3=83=BC=E3=83=B3=E3=81=8C=E3=82=A6=E3=82=A7=E3=82=A4?= =?UTF-8?q?=E3=83=88=E3=81=8C=E5=90=AB=E3=81=BE=E3=82=8C=E3=81=AA=E3=81=84?= =?UTF-8?q?=E5=A0=B4=E5=90=88=E3=81=AB=E3=80=81=E4=B8=80=E4=BA=BA=E7=A7=B0?= =?UTF-8?q?=E7=94=A8=E3=83=98=E3=83=83=E3=83=89=E3=83=AC=E3=82=B9=E3=83=A2?= =?UTF-8?q?=E3=83=87=E3=83=AB=E3=82=92=E4=BD=9C=E6=88=90=E3=81=97=E3=81=AA?= =?UTF-8?q?=E3=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Scripts/FirstPerson/VRMFirstPerson.cs | 65 +++++++++---------- 1 file changed, 30 insertions(+), 35 deletions(-) diff --git a/Assets/VRM/UniVRM/Scripts/FirstPerson/VRMFirstPerson.cs b/Assets/VRM/UniVRM/Scripts/FirstPerson/VRMFirstPerson.cs index e6a8ab9bf..8147b8995 100644 --- a/Assets/VRM/UniVRM/Scripts/FirstPerson/VRMFirstPerson.cs +++ b/Assets/VRM/UniVRM/Scripts/FirstPerson/VRMFirstPerson.cs @@ -125,7 +125,7 @@ namespace VRM return FirstPersonFlag.Auto; } - foreach(var x in context.GLTF.extensions.VRM.firstPerson.meshAnnotations) + foreach (var x in context.GLTF.extensions.VRM.firstPerson.meshAnnotations) { if (x.mesh == index) { @@ -159,10 +159,11 @@ namespace VRM // ここには来ない } - + public static void SetupLayers() { - if (!TriedSetupLayer) { + if (!TriedSetupLayer) + { TriedSetupLayer = true; int layer = LayerMask.NameToLayer("VRMFirstPersonOnly"); FIRSTPERSON_ONLY_LAYER = (layer == -1) ? FIRSTPERSON_ONLY_LAYER : layer; @@ -188,45 +189,39 @@ namespace VRM private static void CreateHeadlessModelForSkinnedMeshRenderer(SkinnedMeshRenderer renderer, Transform eraseRoot) { SetupLayers(); + var bones = renderer.bones; + + var eraseBones = bones.Select((x, i) => + { + // 祖先に削除対象が存在するか + bool erase = x.Ancestor().Any(y => y == eraseRoot); + return new + { + i, + erase, + }; + }) + .Where(x => x.erase) + .Select(x => x.i) + .ToArray() + ; + if (eraseBones.Length == 0) + { + // 削除対象が存在しない + return; + } + + // 元のメッシュを三人称に変更(自分からは見えない) renderer.gameObject.layer = THIRDPERSON_ONLY_LAYER; + // 新規に一人称用のモデルを複製する var go = new GameObject("_headless_" + renderer.name); go.layer = FIRSTPERSON_ONLY_LAYER; go.transform.SetParent(renderer.transform, false); - - var m_eraseBones = renderer.bones.Select(x => - { - var eb = new BoneMeshEraser.EraseBone - { - Bone = x, - }; - - if (eraseRoot != null) - { - // 首の子孫を消去 - if (eb.Bone.Ancestor().Any(y => y == eraseRoot)) - { - //Debug.LogFormat("erase {0}", x); - eb.Erase = true; - } - } - - return eb; - }) - .ToArray(); - - var bones = renderer.bones; - var eraseBones = m_eraseBones - .Where(x => x.Erase) - .Select(x => bones.IndexOf(x.Bone)) - .ToArray(); - - var mesh = BoneMeshEraser.CreateErasedMesh(renderer.sharedMesh, eraseBones); - var erased = go.AddComponent(); - erased.sharedMesh = mesh; + erased.sharedMesh = BoneMeshEraser.CreateErasedMesh(renderer.sharedMesh, eraseBones); erased.sharedMaterials = renderer.sharedMaterials; - erased.bones = renderer.bones; + erased.bones = bones; erased.rootBone = renderer.rootBone; erased.updateWhenOffscreen = true; }