SkinnedMeshRenderer _Erase(GameObject go) { if (go == null) { Debug.LogWarning("select root object in hierarchy"); return(null); } if (m_skinnedMesh == null) { Debug.LogWarning("no skinnedmesh"); return(null); } var bones = m_skinnedMesh.bones; var eraseBones = m_eraseBones .Where(x => x.Erase) .Select(x => bones.IndexOf(x.Bone)) .ToArray(); var meshNode = new GameObject("BoneMeshEraser"); meshNode.transform.SetParent(go.transform, false); var erased = meshNode.AddComponent <SkinnedMeshRenderer>(); erased.sharedMesh = BoneMeshEraser.CreateErasedMesh(m_skinnedMesh.sharedMesh, eraseBones); erased.sharedMaterials = m_skinnedMesh.sharedMaterials; erased.bones = m_skinnedMesh.bones; return(erased); }
/// <summary> /// ヘッドレスモデルを作成する。 /// /// 以下の場合は作成しない。 /// /// * 削除対象が無い場合 /// * 全部削除対象の場合 /// /// </summary> private static Mesh 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(null); } // 元のメッシュを三人称に変更(自分からは見えない) renderer.gameObject.layer = THIRDPERSON_ONLY_LAYER; // 削除対象のボーンに対するウェイトを保持する三角形を除外して、一人称用のモデルを複製する var headlessMesh = BoneMeshEraser.CreateErasedMesh(renderer.sharedMesh, eraseBones); if (headlessMesh.triangles.Length == 0) { // 一人称用のmeshには描画すべき部分が無い(全部削除された) UnityEngine.Object.Destroy(headlessMesh); return(null); } // 一人称用のモデルのセットアップ var go = new GameObject("_headless_" + renderer.name); go.layer = FIRSTPERSON_ONLY_LAYER; go.transform.SetParent(renderer.transform, false); var erased = go.AddComponent <SkinnedMeshRenderer>(); erased.sharedMesh = headlessMesh; erased.sharedMaterials = renderer.sharedMaterials; erased.bones = bones; erased.rootBone = renderer.rootBone; erased.updateWhenOffscreen = true; return(headlessMesh); }
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; }