private static void ReplaceWithPolygonCollider2D(CompositeCollider2D composite)
        {
            var go = composite.gameObject;

            // The convex shape parts are put into our specialized collider component for debug drawing
            var super = go.AddComponent <SuperColliderComponent>();

            var combined = go.AddComponent <PolygonCollider2D>();

            combined.pathCount = composite.pathCount;
            combined.isTrigger = composite.isTrigger;

            // Copy composite paths to combined PolygonCollider2D
            for (int p = 0; p < composite.pathCount; p++)
            {
                var points = composite.GetPathPoints(p);

                if (points.Length > 0)
                {
                    combined.SetPath(p, points);
                }
            }

            // Switch the composite collider to outlines in order to get the outline of our convex with holes polygon
            if (composite.geometryType != CompositeCollider2D.GeometryType.Outlines)
            {
                composite.geometryType = CompositeCollider2D.GeometryType.Outlines;
                composite.GenerateGeometry();
            }

            // Add outline shapes
            for (int p = 0; p < composite.pathCount; p++)
            {
                var points = composite.GetPathPoints(p);

                if (points.Length != 0)
                {
                    super.AddOutline(points);
                }
            }

            // Add shapes from polygon children (which are guaranteed to be convex)
            var childPolygons = go.GetComponentsInChildren <PolygonCollider2D>();

            foreach (var poly in childPolygons)
            {
                if (poly.usedByComposite == true)
                {
                    super.AddPolygonShape(poly.GetPath(0));
                }
            }
        }
        private static void ReplaceWithEdgeCollider2Ds(CompositeCollider2D composite)
        {
            // Add an edge collider child for every path in our composite
            var go = composite.gameObject;

            for (int p = 0; p < composite.pathCount; p++)
            {
                var points = composite.GetPathPoints(p).ToList();

                // Close the loop
                points.Add(points[0]);

                // Add the edge child
                var goEdge = new GameObject("Edge");
                go.AddChildWithUniqueName(goEdge);

                var edge = goEdge.AddComponent <EdgeCollider2D>();
                edge.isTrigger = composite.isTrigger;
                edge.points    = points.ToArray();

                goEdge.AddComponent <SuperColliderComponent>();
            }
        }