diff --git a/Assets/Scripts/MeshGenerator/CircleGenerator.cs b/Assets/Scripts/MeshGenerator/CircleGenerator.cs index 58c302851e4916b01300aa6eadc436a1f5e20420..4eed28f05763e8be4597701be9afeb3eff5565df 100644 --- a/Assets/Scripts/MeshGenerator/CircleGenerator.cs +++ b/Assets/Scripts/MeshGenerator/CircleGenerator.cs @@ -20,14 +20,7 @@ public class CircleGenerator : ShapeGenerator #region Implementation protected override void GenerateShape() { - var circle = CreateCircle(radius, sideCount); - - if (circleMesh.sharedMesh != null) - circleMesh.sharedMesh.Clear(); - circleMesh.mesh = CreateMesh(circle); - - if (circleMesh.transform.TryGetComponent(out MeshCollider meshCol)) - meshCol.sharedMesh = circleMesh.sharedMesh; + AssignMesh(circleMesh, CreateCircle(radius, sideCount)); } /// <summary> diff --git a/Assets/Scripts/MeshGenerator/ConeGenerator.cs b/Assets/Scripts/MeshGenerator/ConeGenerator.cs index 717cd56f47be2883e74198b4da2007083e828bdf..cbbd01e42b45b264eb585d43bada646048b81165 100644 --- a/Assets/Scripts/MeshGenerator/ConeGenerator.cs +++ b/Assets/Scripts/MeshGenerator/ConeGenerator.cs @@ -29,22 +29,9 @@ protected override void GenerateShape() Vector3[] bottomCircle = GetCirclePoints(bottomRadius, sideCount); Vector3[] topCircle = GetCirclePoints(topRadius, sideCount, topPosition); - //side - if (sideMesh.sharedMesh != null) - sideMesh.sharedMesh.Clear(); - sideMesh.mesh = CreateMesh(CreateConeSide(sideCount, bottomCircle, topCircle)); - - //top - if (topMesh.sharedMesh != null) - topMesh.sharedMesh.Clear(); - if (generateTop) - topMesh.mesh = CreateMesh(CreatePlane(topCircle, false)); - - //bottom - if (bottomMesh.sharedMesh != null) - bottomMesh.sharedMesh.Clear(); - if (generateBottom) - bottomMesh.mesh = CreateMesh(CreatePlane(bottomCircle, true)); + AssignMesh(sideMesh, CreateConeSide(sideCount, bottomCircle, topCircle)); + AssignMesh(topMesh, generateTop ? CreatePlane(topCircle, false) : null); + AssignMesh(bottomMesh, generateBottom ? CreatePlane(bottomCircle, true) : null); } private static (Vector3[], int[]) CreateConeSide(int sideCount, Vector3[] bottomCircle, Vector3[] topCircle) diff --git a/Assets/Scripts/MeshGenerator/ShapeGenerator.cs b/Assets/Scripts/MeshGenerator/ShapeGenerator.cs index 7bcddfc85be4f0d415d98016f6bc46114129cb28..619c65751d5f847cafa83c1867806f2094179334 100644 --- a/Assets/Scripts/MeshGenerator/ShapeGenerator.cs +++ b/Assets/Scripts/MeshGenerator/ShapeGenerator.cs @@ -1,3 +1,4 @@ +using System; using System.Linq; using UnityEngine; @@ -12,9 +13,18 @@ public abstract class ShapeGenerator : MonoBehaviour protected abstract void GenerateShape(); #region Helper - protected static Mesh CreateMesh((Vector3[] vertices, int[] triangles) meshValues) + protected static void AssignMesh(MeshFilter meshFilter, (Vector3[] vertices, int[] triangles)? meshValues) { - Mesh mesh = new Mesh(); + if (meshFilter.sharedMesh != null) + meshFilter.sharedMesh.Clear(); + if (meshValues is (Vector3[], int[]) _mv) + meshFilter.mesh = CreateMesh(_mv); + if (meshFilter.transform.TryGetComponent(out MeshCollider meshCol)) + meshCol.sharedMesh = meshFilter.sharedMesh; + } + private static Mesh CreateMesh((Vector3[] vertices, int[] triangles) meshValues) + { + Mesh mesh = new(); (mesh.vertices, mesh.triangles) = (meshValues.vertices, meshValues.triangles); mesh.RecalculateNormals(); //fix lighting return mesh; diff --git a/Assets/Scripts/MeshGenerator/TorusGenerator.cs b/Assets/Scripts/MeshGenerator/TorusGenerator.cs index 95ef7746d9b72022d148fa987423136440778261..f867a1a527e5a6d4c0516185cacd46b5efd2a929 100644 --- a/Assets/Scripts/MeshGenerator/TorusGenerator.cs +++ b/Assets/Scripts/MeshGenerator/TorusGenerator.cs @@ -22,12 +22,7 @@ public class TorusGenerator : ShapeGenerator #region Implementation protected override void GenerateShape() { - if (torusMesh.sharedMesh != null) - torusMesh.sharedMesh.Clear(); - torusMesh.mesh = CreateMesh(CreateTorus(torusRadius, ringRadius, ringSegmentCount, segmentSideCount)); - - if (torusMesh.transform.TryGetComponent(out MeshCollider meshCol)) - meshCol.sharedMesh = torusMesh.sharedMesh; + AssignMesh(torusMesh, CreateTorus(torusRadius, ringRadius, ringSegmentCount, segmentSideCount)); } private static (Vector3[] vertices, int[] triangles) CreateTorus(float torusRadius, float ringRadius, int ringSegmentCount, int segmentSideCount)