示例#1
0
    public static GameObject Create(
//		Vector3 position,
        IVertexProvider VertEdge,
        Vector3 upDirection,
        Vector3 bridgeDirection,
        Material material)
    {
        var go = new GameObject("MakeBridgeGeometry.Create();");

        var mf   = go.AddComponent <MeshFilter>();
        var mesh = mf.mesh;

        List <Vector3> newVerts = new List <Vector3>();
        List <int>     newTris  = new List <int>();
        List <Vector2> newUVs   = new List <Vector2>();

        float bridgeDistance = bridgeDirection.magnitude;

        // make a strip going down
        Vector3 prevVert = Vector3.zero;

        Vector2 downUV = new Vector2(0, 1);

        Vector2 leftUV  = new Vector2(0, 0);
        Vector2 rightUV = new Vector2(1, 0);

        // compute where we should go
        Vector3 location = go.transform.position;

        {
            var centroid  = Vector3.zero;
            int vertCount = 0;
            foreach (var v in VertEdge.GetVertices())
            {
                centroid += v;
                vertCount++;
            }
            if (vertCount > 0)
            {
                centroid /= vertCount;
            }

            // stick this bridge geometry origin at the centroid of
            // the edges plus half the bridge distance
            location = centroid + bridgeDirection / 2;;

            go.transform.position = location;
        }

        foreach (var v in VertEdge.GetVertices())
        {
            var v2 = v + bridgeDirection;

            // raycast this part down to match the first collider we hit
            var        ray = new Ray(origin: v2, direction: -upDirection);
            RaycastHit hit;
            if (Physics.Raycast(ray: ray, hitInfo: out hit, maxDistance: 100))
            {
                v2 = hit.point;
            }

            int n = newVerts.Count;

            float vDistance = (v - prevVert).magnitude;

            float step = vDistance / bridgeDistance;

            newVerts.Add(v);
            newVerts.Add(v2);

            newUVs.Add(leftUV);
            newUVs.Add(rightUV);

            leftUV  += downUV * step;
            rightUV += downUV * step;

            if (n > 0)
            {
                newTris.Add(n - 2);
                newTris.Add(n);
                newTris.Add(n - 1);

                newTris.Add(n);
                newTris.Add(n + 1);
                newTris.Add(n - 1);
            }

            prevVert = v;
        }

        // back out our local position from these points,
        // since points are in local space
        for (int i = 0; i < newVerts.Count; i++)
        {
            newVerts[i] -= location;
        }

        mesh.vertices  = newVerts.ToArray();
        mesh.triangles = newTris.ToArray();
        mesh.uv        = newUVs.ToArray();

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

        mf.mesh = mesh;

        var mr = go.AddComponent <MeshRenderer>();

        mr.material = material;

        return(go);
    }