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.



