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)