コード例 #1
0
    // =========================================================================
    private void GenerateSinglePrism(ref Mesh mesh2D, int frontIndex2D)
    {
        int[]          triangles2D = mesh2D.triangles;
        Vector3[]      vertices2D  = mesh2D.vertices;
        List <Vector3> vertices    = new List <Vector3> {
        };
        List <int> triangles       = new List <int> {
        };

        // select individual triangle from triangles2D with frontIndex2D
        // single triangle vertices in 2D coords
        Vector3[] triVerts2D =
        {
            vertices2D[triangles2D[frontIndex2D * 3 + 2]],
            vertices2D[triangles2D[frontIndex2D * 3 + 1]],
            vertices2D[triangles2D[frontIndex2D * 3 + 0]]
        };

        // structure required to utilize Mattatz's circumcenter code.
        List <Vertex2D> triVerts2D2 = new List <Vertex2D>();

        for (int i = 0; i < 3; i++)
        {
            Vector3 v3D = triVerts2D[i];
            Vector2 v2D = new Vector2(v3D[0], v3D[1]); // need only x & y
            triVerts2D2.Add(new Vertex2D(v2D));
        }

        Segment2D s0 = new Segment2D(triVerts2D2[0], triVerts2D2[1]);
        Segment2D s1 = new Segment2D(triVerts2D2[1], triVerts2D2[2]);
        Segment2D s2 = new Segment2D(triVerts2D2[2], triVerts2D2[0]);

        Triangle2D triangle2D2 = new Triangle2D(s0, s1, s2);
        Vector2    center2D    = triangle2D2.Circumcenter();
        Vector3    center      = center2D;

        // translate triangle to place circumcenter at the origin
        Vector3[] triVerts2Dshifted = new Vector3[3];
        for (int i = 0; i < 3; i++)
        {
            triVerts2Dshifted[i] = triVerts2D[i] - center;
        }
        AddFrontFace(vertices, triangles, triVerts2Dshifted);
        AddBackFace(vertices, triangles, triVerts2Dshifted);
        AddSideFaces(vertices, triangles, triVerts2Dshifted);

        Vector3 center3D = new Vector3(center2D[0], 0, center2D[1]);

        // Create output game object
        GameObject prism = new GameObject("Prism");

        prism.transform.parent = gameObject.transform;
        prism.tag = "Prism";
        // offset is location of parent.  Used to set the center of the
        //   block of prisms.
        Vector3 offset = gameObject.transform.position;

        // center3D (above) is the circumcenter of the triangle from which the
        //     prism is constructed.
        prism.transform.position = center3D + offset;
        prism.AddComponent <MeshFilter>();
        prism.AddComponent <MeshRenderer>();
        //prism.AddComponent<FloatScalingEffect>(); // Added scaling animation
        Mesh mesh = prism.GetComponent <MeshFilter>().mesh;

        mesh.vertices  = vertices.ToArray();
        mesh.triangles = triangles.ToArray();
        //mesh.uv = new Vector2[]
        //    { new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1) };

        mesh.RecalculateNormals();
        mesh.RecalculateBounds();

        // now that we have the mesh setup, we can add colliders.
        prism.AddComponent <MeshCollider>();
        prism.GetComponent <MeshCollider>().convex = true;

        prism.AddComponent <PrismImpact>();
        prism.AddComponent <PrismMoveInterface>();

        prism.GetComponent <MeshRenderer>().material = mat;
    }