How I made the board…
I made a model of one tile, it consists of a hexagonal cylinder, with extra faces on the top.
Then I made four different copies of this in Unity, and modified them for Rough, Woods, Forest, and Clear.
I added rocks and trees to each tile, then added a script that only runs once that randomly displaces the trees and rocks, and for some of the tiles (like Clear), I randomly destroy most of them, leaving a few randomly placed and chosen features on the tile. There is a custom version of this script on each Prefab.
I have a couple of arrays that store two points about the map. The first stores the type of each hex, and the other stores the height.
The script reads these two arrays, and Instantiates the tiles, one by one, assigning variables for X, Y, Z coordinates to a script called HTMod that is also on each tile. (These are the grid coordinates, not the actual coordinates in Unity, so the first tile would have 0,height,0)
On Update, HTMod moves the tile to which it is attached to the proper actual coordinates.
It also assigns variables that point to each of the hex’s six neighbors, and the height difference between the two.
As I Instantiate each tile, I add it to a Unity Array, and also assign the number in the array to a value in HtMod called Index. This way, I can refer to tiles by the number in the array, or by actually referring to the GameObject.
Then the magic happens. HTMod looks at each tile, and if the neighbors are not zero height difference, it modifies the vertices to make a smooth slope.
Actually, it only moves the verts halfway, the other tile goes the rest of the way, so the slope is spread over the two tiles.
The water planes are at a set height, any terrain that dips low enough will end up below the water.