here is a script for creating terrains from height maps. just pop in the terrain, your height map, and run it bam, your terrain looks like your height map. just copy paste into a blank script
using UnityEngine;
using System.Collections;
public class TerrianScript : MonoBehaviour {
public bool RunIt;
public Terrain DaTerrain;
private float[,] Heights;
public Texture2D DaPic;
//note this must be done while the game is running inorder to make it go
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if(RunIt)
{
DaMakers();
}
}
private void DaMakers()
{
// a good place to get a height map from the website below
//https://heightmap.skydark.pl
//Warning - in older verisons of unity an alpha transparency will throw an error if imported, to fix, simply open and save in MS paint, or other wise remove alphas.
Texture2D copy = duplicateTexture(DaPic);
//this gets the terrian height data
// WARNING - if the Terrain data is wider than your picture it will throw an error
//
DaTerrain.terrainData.heightmapResolution = copy.width;
Heights = DaTerrain.terrainData.GetHeights(0, 0, DaTerrain.terrainData.heightmapWidth, DaTerrain.terrainData.heightmapHeight);
for (var i =0;i< DaTerrain.terrainData.heightmapWidth; i++)
{
for(var j=0;j< DaTerrain.terrainData.heightmapHeight; j++)
{
//the hieghts range from 0 to 1 and the tallest point will be
Heights[i, j] = copy.GetPixel(j, i).grayscale;
}
}
DaTerrain.terrainData.SetHeights(0, 0, Heights);
RunIt = false;
}
//this makes whatever height map you are importing reasonable
private Texture2D duplicateTexture(Texture2D source)
{
RenderTexture renderTex = RenderTexture.GetTemporary(
source.width,
source.height,
0,
RenderTextureFormat.Default,
RenderTextureReadWrite.Linear);
Graphics.Blit(source, renderTex);
RenderTexture previous = RenderTexture.active;
RenderTexture.active = renderTex;
Texture2D readableText = new Texture2D(source.width, source.height);
readableText.ReadPixels(new Rect(0, 0, renderTex.width, renderTex.height), 0, 0);
readableText.Apply();
RenderTexture.active = previous;
RenderTexture.ReleaseTemporary(renderTex);
return readableText;
}
}