private void InitProfile() { var profile = GetProfile(); var width = serializedObject.FindProperty("_width").floatValue; var prevVect = serializedObject.FindProperty("_prevVect"); var rotation = serializedObject.FindProperty("_rotation"); var triangulationPath1 = serializedObject.FindProperty("_triangulationPath1"); var triangulationPath2 = serializedObject.FindProperty("_triangulationPath2"); var initpoints = new List <Vector3>(); // Корректируем профиль if (profile.arraySize < 3) { var poly = Geometry.CreatePolygon(3, Axis.Z, 0.5f, 0f); for (var i = 0; i < 3; i++) { if (profile.arraySize < i + 1) { profile.InsertArrayElementAtIndex(i); } profile.GetArrayElementAtIndex(i).vector3Value = poly[i]; } } // Делаем копию профиля var initProfile = serializedObject.FindProperty("_initProfile"); for (var i = 0; i < profile.arraySize; i++) { if (initProfile.arraySize < i + 1) { initProfile.InsertArrayElementAtIndex(i); } var propSource = profile.GetArrayElementAtIndex(i); initProfile.GetArrayElementAtIndex(i).vector3Value = propSource.vector3Value; initpoints.Add(propSource.vector3Value); } // Масштабируем и копируем результат в workProfile var workProfile = serializedObject.FindProperty("_workProfile"); var baseProfile = serializedObject.FindProperty("_baseProfile"); var workpoints = Geometry.ScalePoly(initpoints, width); for (var i = 0; i < initpoints.Count; i++) { if (workProfile.arraySize < i + 1) { workProfile.InsertArrayElementAtIndex(i); } if (baseProfile.arraySize < i + 1) { baseProfile.InsertArrayElementAtIndex(i); } workProfile.GetArrayElementAtIndex(i).vector3Value = workpoints[i]; baseProfile.GetArrayElementAtIndex(i).vector3Value = workpoints[i]; } prevVect.vector3Value = Vector3.forward; rotation.quaternionValue = new Quaternion(0, 0, 0, 1); var triangulator = new Triangulator(); var profile2d = initpoints.Select(point => (Vector2)point).ToList(); var path = triangulator.GetTriangulationIndexes(profile2d); for (var i = 0; i < path.Count; i++) { if (triangulationPath1.arraySize < i + 1) { triangulationPath1.InsertArrayElementAtIndex(i); } if (triangulationPath2.arraySize < i + 1) { triangulationPath2.InsertArrayElementAtIndex(i); } triangulationPath1.GetArrayElementAtIndex(i).vector3Value = path[i]; } CutArray(triangulationPath1, path.Count); CutArray(triangulationPath2, path.Count); for (var i = triangulationPath1.arraySize - 1; i >= 0; i--) { var triangle = triangulationPath1.GetArrayElementAtIndex(triangulationPath1.arraySize - 1 - i).vector3Value; triangulationPath2.GetArrayElementAtIndex(i).vector3Value = new Vector3(triangle.x, triangle.z, triangle.y); } // Обрезаем все массивы CutArray(profile, initpoints.Count); CutArray(initProfile, initpoints.Count); CutArray(workProfile, initpoints.Count); CutArray(baseProfile, initpoints.Count); }