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.