Wie kann ich bei Unity einem 2D generierten Mesh einen Collider geben?

Ich arbeite in Unity zurzeit an einen kleinen Projekt und bin auf folgendes Problem gestoßen:

Ich generiere dieses Mesh mit Perlin Noises, also quasi eine Berglandschaft. Sie sieht auch gut aus, nur jetzt habe ich das Problem mit den Collider. Und zwar mache ich das aktuell mit einem Polygon Collider, wo ich die Punkte per Code selber erstelle:

private void GenCollider()
{
  GrassMashObject.AddComponent<PolygonCollider2D>();
  GrassMashObject.GetComponent<PolygonCollider2D>().sharedMaterial = GrassPhysics;
  PolygonCollider2D polygonCollider = GrassMashObject.GetComponent<PolygonCollider2D>();

  if (polygonCollider != null)
  {
    Vector2[] points = new Vector2[(WorldSize + 1) * (yHight + 1)];

    for (int i = 0, y = 0; y <= yHight; y++)
    {
      for (int x = 0; x <= WorldSize; x++)
      {
        points[i] = new Vector2(x, y - (WorldSize / 4f));

        if (y == 1)
        {
          float perlin1 = (float)x / PerlinScale;
          float perlin2 = (float)y / PerlinScale;
          float perlin3 = Mathf.PerlinNoise(perlin1, perlin2);
          float perlin4 = Mathf.PerlinNoise(perlin1 * 2, perlin2 * 2);
          float perlin5 = Mathf.PerlinNoise(perlin1 / 2, perlin2 / 2);
          points[i].y = y + ((perlin3 + perlin4 + perlin5) * PerlinHeight);
        }

        i++;
      }
    }

    polygonCollider.points = points;
  }
}

Es funktioniert ganz gut, nur werden manche Punkte falsch zusammengesetzt und deshalb werden sehr unnötige “Linien” zwischen den Punkten generiert. Deshalb kommt es auch manchmal zu massiven Performenceeinbrüchen.

Ich bin für jede Hilfe dankbar! Danke im Voraus!

(1 votes)
Loading...

Similar Posts

Subscribe
Notify of
1 Answer
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Hemo20
10 months ago
private void GenCollider()
{
    EdgeCollider2D edgeCollider = GrassMashObject.AddComponent();
    edgeCollider.sharedMaterial = GrassPhysics;

    List points = new List();

    for (int y = 0; y <= yHight; y++)
    {
        for (int x = 0; x < WorldSize; x++) // Reduziert um 1, um Überlappung der Linien zu vermeiden
        {
            Vector2 startPoint = new Vector2(x, y - (WorldSize / 4f));

            float perlin1 = (float)x / PerlinScale;
            float perlin2 = (float)y / PerlinScale;
            float perlin3 = Mathf.PerlinNoise(perlin1, perlin2);
            float perlin4 = Mathf.PerlinNoise(perlin1 * 2, perlin2 * 2);
            float perlin5 = Mathf.PerlinNoise(perlin1 / 2, perlin2 / 2);
            float height = y + ((perlin3 + perlin4 + perlin5) * PerlinHeight);

            Vector2 endPoint = new Vector2(x + 1, height); // Nächster Punkt

            points.Add(startPoint);
            points.Add(endPoint);
        }
    }

    edgeCollider.points = points.ToArray();
}