private static void CreateHeadlessModelForSkinnedMeshRenderer(SkinnedMeshRenderer renderer, Transform eraseRoot) { SetupLayers(); 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 <SkinnedMeshRenderer>(); erased.sharedMesh = mesh; erased.sharedMaterials = renderer.sharedMaterials; erased.bones = renderer.bones; erased.rootBone = renderer.rootBone; erased.updateWhenOffscreen = true; }
void OnValidate() { //Debug.Log("OnValidate"); if (m_skinnedMesh == null) { m_eraseBones = new BoneMeshEraser.EraseBone[] { }; return; } if (EraseRoot == null) { if (m_animator != null) { EraseRoot = m_animator.GetBoneTransform(HumanBodyBones.Head); //Debug.LogFormat("head: {0}", EraseRoot); } } m_eraseBones = m_skinnedMesh.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(); }