http://wiki.unity3d.com/index.php?title=Triangulator This script can be used to split a 2D polygon into triangles. The algorithm supports concave polygons, but not polygons with holes, or multiple polygons at once. Note: This is a naive triangulation implementation. For more well-distributed triangles, consider using Delaunay triangulation, such as with the script here [1]
コード例 #1
0
        void Update()
        {
      #if UNITY_EDITOR
            OnValidate();
      #endif

            Mesh mesh = new Mesh();

            PolygonCollider2D _polygon2d = gameObject.GetComponent <PolygonCollider2D>();
            BoxCollider2D     _box2d     = gameObject.GetComponent <BoxCollider2D>();
            CircleCollider2D  _circle2d  = gameObject.GetComponent <CircleCollider2D>();
            EdgeCollider2D    _edge2d    = gameObject.GetComponent <EdgeCollider2D>();

            if (_polygon2d)
            {
                // points are alredy rotated :)
                int       pointCount = _polygon2d.GetTotalPointCount();
                Vector2[] points     = _polygon2d.points;

                Vector3[] vertices = new Vector3[pointCount];
                for (int j = 0; j < pointCount; j++)
                {
                    Vector2 actual = points[j];
                    vertices[j] = new Vector3(actual.x, actual.y, 0);
                }
                Triangulator tr        = new Triangulator(points);
                int[]        triangles = tr.Triangulate();
                mesh.vertices  = vertices;
                mesh.triangles = triangles;
            }

            if (_box2d)
            {
                mesh.vertices = GetBoxCorners(_box2d);
                int[] triangles = { 0, 1, 2, 1, 3, 2 };
                mesh.triangles = triangles;
            }

            if (_circle2d)
            {
                float scale = 1f / 16f;

                Vector3[] vertices = new Vector3[16];
                Vector2[] points   = new Vector2[16];
                for (int j = 0; j < 16; j++)
                {
                    float x = (_circle2d.offset.x +
                               Mathf.Cos(scale * j * 2 * Mathf.PI) * _circle2d.radius) *
                              _circle2d.transform.localScale.x;
                    float y = (_circle2d.offset.y +
                               Mathf.Sin(scale * j * 2 * Mathf.PI) * _circle2d.radius) *
                              _circle2d.transform.localScale.y;
                    points[j]   = new Vector2(x, y);
                    vertices[j] = new Vector3(x, y, 0);
                }
                Triangulator tr        = new Triangulator(points);
                int[]        triangles = tr.Triangulate();
                mesh.vertices  = vertices;
                mesh.triangles = triangles;
            }

            if (_edge2d)
            {
                Debug.LogWarning("EdgeCollider2D is not supported");
            }

            _mf.mesh = mesh;
        }
コード例 #2
0
    void Update() {
      #if UNITY_EDITOR
      OnValidate();
      #endif

      Mesh mesh = new Mesh();

      PolygonCollider2D _polygon2d = gameObject.GetComponent<PolygonCollider2D>();
      BoxCollider2D _box2d = gameObject.GetComponent<BoxCollider2D>();
      CircleCollider2D _circle2d = gameObject.GetComponent<CircleCollider2D>();
      EdgeCollider2D _edge2d = gameObject.GetComponent<EdgeCollider2D>();

      if (_polygon2d) {
        // points are alredy rotated :)
        int pointCount = _polygon2d.GetTotalPointCount();
        Vector2[] points = _polygon2d.points;

        Vector3[] vertices = new Vector3[pointCount];
        for (int j = 0; j < pointCount; j++) {
          Vector2 actual = points[j];
          vertices[j] = new Vector3(actual.x, actual.y, 0);
        }
        Triangulator tr = new Triangulator(points);
        int[] triangles = tr.Triangulate();
        mesh.vertices = vertices;
        mesh.triangles = triangles;
      }

      if (_box2d) {
        mesh.vertices = GetBoxCorners(_box2d);
        int[] triangles = {0, 1, 2, 1, 3, 2};
        mesh.triangles = triangles;
      }

      if (_circle2d) {
        float scale = 1f / 16f;

        Vector3[] vertices = new Vector3[16];
        Vector2[] points = new Vector2[16];
        for (int j = 0; j < 16; j++) {
          float x = (_circle2d.offset.x +
                     Mathf.Cos(scale * j * 2 * Mathf.PI) * _circle2d.radius) *
                    _circle2d.transform.localScale.x;
          float y = (_circle2d.offset.y +
                     Mathf.Sin(scale * j * 2 * Mathf.PI) * _circle2d.radius) *
                    _circle2d.transform.localScale.y;
          points[j] = new Vector2(x, y);
          vertices[j] = new Vector3(x, y, 0);
        }
        Triangulator tr = new Triangulator(points);
        int[] triangles = tr.Triangulate();
        mesh.vertices = vertices;
        mesh.triangles = triangles;
      }

      if (_edge2d) {
        Debug.LogWarning("EdgeCollider2D is not supported");
      }

      _mf.mesh = mesh;
    }