Dans la version actuelle, la forêt a été faite à la main en copiant-collant plein de Prefabs d'arbres. On pourrait plutôt créer la forêt avec du code.
On peut imaginer plusieurs algorithmes pour générer des arbres :
Instancier des arbres alignés sur des rangées
Instancier des arbres au hasard, en vérifiant qu'il y a assez d'espace entre chaque arbre
Simuler une forêt créée au hasard: suivre des petites règles pour décider de quel arbre meurt et quel arbre naît pendant quelques générations, et instancier les arbres selon le résultat final
Ces choix doivent se retrouver dans le menu.
La forêt générée sur des rangées aurait l'air de ça :
Si on la génère au hasard, elle donnerait un résultat différent à chaque fois dans le style de :
Et finalement, avec la simulation de forêt, on obtiendrait encore un résultat au hasard mais avec des motifs semi-réalistes :
Précisions sur les Algorithmes
Arbres au hasard
Il ne doit pas y avoir deux arbres collés dans une forêt générée au hasard. Pour ce faire, vous pourriez commencer par choisir N positions au hasard, puis considérer ces positions une par une et supprimer les autres qui sont trop proches de celles-ci.
On vous déconseille fortement d'essayer d'utiliser les Collider pour ça, choisissez les positions avant d'Instanciate() les arbres.
La classe Rect pourrait vous aider à vérifier en 2D si deux arbres sont trop proches l'un de l'autre. Vous pourriez créer deux rectangles de la taille qu'un arbre prendrait et vérifier si arbre1.Overlaps(arbre2).
Forêt simulée
Pour simuler une forêt, on va utiliser un algorithme inspiré du Game of Life, qui est utilisé dans plusieurs jeux de type roguelike pour générer des dongeons au hasard.
On construit une grille 2D de bool (true = il y a un arbre, false = il n'y en a pas).
Chaque case est initialement choisie au hasard, avec 70% de chances d'être à true.
Pour obtenir la prochaine génération d'arbres, on crée un nouveau tableau 2D de bool et on applique la formule suivante sur chaque case :
Si dans l'ancienne génération, la case contenait un arbre et avait 3, 4, 6, 7 ou 8 arbres voisins, l'arbre reste vivant dans la prochaine génération.
Si dans l'ancienne génération, la case ne contenait pas d'arbre et avait 3, 6, 7 ou 8 arbres voisins, un arbre est planté dans cette case.
Dans tous les autres cas, la case est vide dans la prochaine génération (ie, l'arbre meurt s'il y en avait un)
Les voisins d'une case sont les cases en haut, bas, gauche, droite et les diagonales.
Pour obtenir un résultat intéressant, on devrait faire passer 10 générations d'arbres dans notre simulation. Ça devrait donner un tableau qui n'est ni trop plein ni trop vide.
Finalement, pour ajouter des arbres dans la scène, on prend la grille générée et on Instanciate() les arbres aux positions correspondantes aux cases à true seulement. Pour éviter que le résultat ne ressemble trop à une grille, on ajoute une valeur aléatoire à la coordonnée x et à la coordonnée z de l'arbre créé, choisies entre -1.25f et +1.25f. (Note: dans cet algorithme, les arbres peuvent finir assez proches l'un de l'autre à cause de cette valeur au hasard)
Exemple d'exécution de l'algo de simulation
Génération 0 (choisie au hasard)
| x | | x | | x |
| x | x | x | x | |
| | x | x | x | |
| | x | x | x | |
Génération 1 (selon les formules)
| | | x | | |
| x | x | x | | x |
| | x | x | | x |
| | x | | x | |
Génération 2 (selon les formules)
| | | | | |
| | | x | | |
| | x | x | | |
| | | | | |
Génération 3 (selon les formules)
| | | | | |
| | x | | | |
| | | | | |
| | | | | |
Notes d'implémentation
Vous devez utiliser le patron Stratégie vu en classe. Faites-vous une hiérarchie de classes pour les différents algorithmes de génération de forêt.
Vous aurez probablement besoin de créer "plusieurs petites forêts", dans le sens où il sera probablement plus facile de découper la zone à remplir d'arbres en plusieurs petits rectangles et de générer des arbres dans chaque rectangle.
Dans la version actuelle, la forêt a été faite à la main en copiant-collant plein de Prefabs d'arbres. On pourrait plutôt créer la forêt avec du code.
On peut imaginer plusieurs algorithmes pour générer des arbres :
Ces choix doivent se retrouver dans le menu.
La forêt générée sur des rangées aurait l'air de ça :
Si on la génère au hasard, elle donnerait un résultat différent à chaque fois dans le style de :
Et finalement, avec la simulation de forêt, on obtiendrait encore un résultat au hasard mais avec des motifs semi-réalistes :
Précisions sur les Algorithmes
Arbres au hasard
Il ne doit pas y avoir deux arbres collés dans une forêt générée au hasard. Pour ce faire, vous pourriez commencer par choisir N positions au hasard, puis considérer ces positions une par une et supprimer les autres qui sont trop proches de celles-ci.
On vous déconseille fortement d'essayer d'utiliser les Collider pour ça, choisissez les positions avant d'
Instanciate()
les arbres.La classe
Rect
pourrait vous aider à vérifier en 2D si deux arbres sont trop proches l'un de l'autre. Vous pourriez créer deux rectangles de la taille qu'un arbre prendrait et vérifier siarbre1.Overlaps(arbre2)
.Forêt simulée
Pour simuler une forêt, on va utiliser un algorithme inspiré du Game of Life, qui est utilisé dans plusieurs jeux de type roguelike pour générer des dongeons au hasard.
On construit une grille 2D de
bool
(true
= il y a un arbre,false
= il n'y en a pas).Chaque case est initialement choisie au hasard, avec 70% de chances d'être à
true
.Pour obtenir la prochaine génération d'arbres, on crée un nouveau tableau 2D de
bool
et on applique la formule suivante sur chaque case :Les voisins d'une case sont les cases en haut, bas, gauche, droite et les diagonales.
Pour obtenir un résultat intéressant, on devrait faire passer 10 générations d'arbres dans notre simulation. Ça devrait donner un tableau qui n'est ni trop plein ni trop vide.
Finalement, pour ajouter des arbres dans la scène, on prend la grille générée et on
Instanciate()
les arbres aux positions correspondantes aux cases àtrue
seulement. Pour éviter que le résultat ne ressemble trop à une grille, on ajoute une valeur aléatoire à la coordonnée x et à la coordonnée z de l'arbre créé, choisies entre -1.25f et +1.25f. (Note: dans cet algorithme, les arbres peuvent finir assez proches l'un de l'autre à cause de cette valeur au hasard)Exemple d'exécution de l'algo de simulation
Notes d'implémentation
Vous devez utiliser le patron Stratégie vu en classe. Faites-vous une hiérarchie de classes pour les différents algorithmes de génération de forêt.
Vous aurez probablement besoin de créer "plusieurs petites forêts", dans le sens où il sera probablement plus facile de découper la zone à remplir d'arbres en plusieurs petits rectangles et de générer des arbres dans chaque rectangle.