using System.Collections; using System.Collections.Generic; using UnityEngine; using Sirenix.OdinInspector; public class MeshSelection : MonoBehaviour { [DetailedInfoBox("使用说明", "1、选择要修改的物体\n2、点击开始选择,然后“ctrl+左键”选择网格上的面,选择完毕后点击生成\n3、选择第二个面进行生成点位\n4、点击生成中心点")] [LabelText("需要修改的物体")] public GameObject ToolSelectObj; [HideInInspector] public List SelectedTrianglesIndex = new List(); [HideInInspector] public HashSet TrianglesVector3s = new HashSet(); [LabelText("第一个点位")] [ShowIf("showF"), ReadOnly] public GameObject firstObj; [LabelText("第二个点位")] [ShowIf("showS"),ReadOnly] public GameObject SecondObj; bool showF = false; bool showS = false; bool showC = false; public void GetBoundaryVertices(Mesh mesh) { Vector3[] vertices = mesh.vertices; int[] triangles = mesh.triangles; Dictionary<(int, int), int> edgeFaces = new Dictionary<(int, int), int>(); foreach (var i in SelectedTrianglesIndex) { int a = triangles[i]; int b = triangles[i + 1]; int c = triangles[i + 2]; RegisterEdge(a, b, edgeFaces); RegisterEdge(b, c, edgeFaces); RegisterEdge(c, a, edgeFaces); } foreach (var edge in edgeFaces) { if (edge.Value == 1) { TrianglesVector3s.Add(ToolSelectObj.transform.TransformPoint(vertices[edge.Key.Item1])); TrianglesVector3s.Add(ToolSelectObj.transform.TransformPoint(vertices[edge.Key.Item2])); } } } private static void RegisterEdge(int a, int b, Dictionary<(int, int), int> edgeFaces) { var edge = a < b ? (a, b) : (b, a); edgeFaces.TryGetValue(edge, out int count); edgeFaces[edge] = count + 1; } public void CreateCenter() { Vector3 v3 = Vector3.zero; foreach(Vector3 vector3 in TrianglesVector3s) { v3 += vector3; } if(firstObj == null) { firstObj = new GameObject(); firstObj.transform.SetParent(ToolSelectObj.transform.parent, true); firstObj.transform.position = v3 / TrianglesVector3s.Count; firstObj.name = ToolSelectObj.name + "-第一个生成点"; showF = true; TrianglesVector3s.Clear(); if (showF && showS) showC = true; return; } if (SecondObj == null) { SecondObj = new GameObject(); SecondObj.transform.SetParent(ToolSelectObj.transform.parent, true); SecondObj.transform.position = v3 / TrianglesVector3s.Count; SecondObj.name = ToolSelectObj.name + "-第二个生成点"; showS = true; TrianglesVector3s.Clear(); if (showF && showS) showC = true; return; } } [Button("生成中心点")] [ShowIf("showC")] public void CreateCenterObj() { GameObject obj = new GameObject(); obj.transform.SetParent(ToolSelectObj.transform.parent, true); obj.transform.position = (firstObj.transform.position + SecondObj.transform.position) / 2; obj.transform.rotation = Quaternion.LookRotation( (firstObj.transform.position - SecondObj.transform.position).normalized); obj.name = ToolSelectObj.name + "---生成点"; ToolSelectObj.transform.SetParent(obj.transform); DestroyImmediate(firstObj); DestroyImmediate(SecondObj); showC= showF = showS = false; TrianglesVector3s.Clear(); } }