I. Introduction▲
Cette série explique comment générer de manière procédurale des continents dans Unity.
Vous pouvez retrouver les autres épisodes de cette série dans le sommaire dédié.
II. Vidéo▲
Unity - Génération procédurale de terrain - Couleurs
III. Résumé▲
Grâce à la carte des hauteurs (« heightmap ») générée au cours des précédents épisodes, nous allons maintenant créer une carte de couleurs en assignant des couleurs pour des hauteurs spécifiques.
III-A. Implémentation▲
Pour cela, nous créons une structure pour représenter le type de terrain :
[System.Serializable]
public struct TerrainType {
public string name;
public float height;
public Color colour;
}La balise [System.Serializable] permet à l'éditeur d'afficher la structure.
Ensuite, vous pouvez afficher une variable regions dans l'éditeur afin que l'utilisateur puisse configurer les régions :
public TerrainType[] regions;Pour créer la carte des couleurs, nous utilisons la fonction GenerateMap(), qui devient comme suit :
public void GenerateMap() {
float[,] noiseMap = Noise.GenerateNoiseMap (mapWidth, mapHeight, seed, noiseScale, octaves, persistance, lacunarity, offset);
Color[] colourMap = new Color[mapWidth * mapHeight];
for (int y = 0; y < mapHeight; y++) {
for (int x = 0; x < mapWidth; x++) {
float currentHeight = noiseMap [x, y];
for (int i = 0; i < regions.Length; i++) {
if (currentHeight <= regions [i].height) {
colourMap [y * mapWidth + x] = regions [i].colour;
break;
}
}
}
}
MapDisplay display = FindObjectOfType<MapDisplay> ();
if (drawMode == DrawMode.NoiseMap) {
display.DrawTexture (TextureGenerator.TextureFromHeightMap(noiseMap));
} else if (drawMode == DrawMode.ColourMap) {
display.DrawTexture (TextureGenerator.TextureFromColourMap(colourMap, mapWidth, mapHeight));
}
}Pour l'affichage, nous souhaitons aussi bien pouvoir afficher la carte des hauteurs que la carte des couleurs. Pour cela, une énumération a été mise en place ainsi qu'un nouveau script, TextureGenerator.cs, dédié à la génération des textures correspondantes :
using UnityEngine;
using System.Collections;
public static class TextureGenerator {
public static Texture2D TextureFromColourMap(Color[] colourMap, int width, int height) {
Texture2D texture = new Texture2D (width, height);
texture.filterMode = FilterMode.Point;
texture.wrapMode = TextureWrapMode.Clamp;
texture.SetPixels (colourMap);
texture.Apply ();
return texture;
}
public static Texture2D TextureFromHeightMap(float[,] heightMap) {
int width = heightMap.GetLength (0);
int height = heightMap.GetLength (1);
Color[] colourMap = new Color[width * height];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
colourMap [y * width + x] = Color.Lerp (Color.black, Color.white, heightMap [x, y]);
}
}
return TextureFromColourMap (colourMap, width, height);
}
}La texture des couleurs a été configurée de manière à enlever le flou entre les couleurs grâce à texture.filterMode = FilterMode.Point. Aussi, sur les côtés, il est possible de voir des bordures de couleurs qui s'enlèvent avec texture.wrapMode = TextureWrapMode.Clamp.
Ce qui fait que le script MapDisplay.cs devient :
using UnityEngine;
using System.Collections;
public class MapDisplay : MonoBehaviour {
public Renderer textureRender;
public void DrawTexture(Texture2D texture) {
textureRender.sharedMaterial.mainTexture = texture;
textureRender.transform.localScale = new Vector3 (texture.width, 1, texture.height);
}
}Cette méthode d'assignation des régions pose toutefois un problème : il est nécessaire que la définition des hauteurs des régions soit ordonnée.
IV. Commenter▲
Vous pouvez commenter et donner vos avis dans la discussion associée sur le forum.



