IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Unity - Génération procédurale de terrain

Couleurs

L'auteur

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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 :

 
Sélectionnez
[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 :

 
Sélectionnez
public TerrainType[] regions;

Pour créer la carte des couleurs, nous utilisons la fonction GenerateMap(), qui devient comme suit :

 
Sélectionnez
    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 :

TextureGenerator.cs
Sélectionnez
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 :

 
Sélectionnez
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.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Copyright © 2017 Unity Technologies. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.