The mesh does have a mesh collider attached, and so the player doesn't fall the way through the mesh - just the "black line". The height of the mesh (on the y-axis) is generated using perlin noise that I multiply by 800 (to increase the waviness), and that is set when I set the vertices. I suspect that this issue has to do with the normals or the uvs not adjusting to the y-axis, but I've messed around with it a lot and nothing seems to help. I currently generate the normals with RecalculateNormals() after I generate the vertices, triangles, and uvs, and calculate the uvs in a for-loop where I take each vertex's x and z axis and divide it by the number of vertices on that axis time the distance between them (to make it between 0 and 1).
I figured it out, and it had nothing to do with UVs or normals like I had thought. Actually, there was a problem with how the triangles were generating - most of the last row's triangles were put at the wrong positions and at the wrong angle, leading to the black line crossing the mesh. Fixing the triangles fixed the problem.