vendredi 22 juin 2018

[Unity3D][Défi50jours] Jour 4 - Génération d'un terrain - suite et fin

Bonsoir cher ami lecteur.
Tout d'abord, pour ceux qui l'attendaient, je suis désolé de n'avoir pas pu faire la session d'hier en live, mais je manquais d'énergie pour le faire suite à une journée bien trop chargée.
Et l'update du jour est venue tardivement parce que ben, journée chargée aussi quoi.



Sur ce trêve d'escusage, place compte rendage.

Le but de la session d'hier était donc de finir ce qui avait été commencé la veille, à savoir passer la map en 3d, et essayer de sauvegarder/charger cette même map.




Etape 1: amélioration de l'algorithme

Avant de commencer, j'ai pris quelque temps pour peaufiner la génération de la carte. Pour le moment, il y avait un peu de tout, mais je voulais avoir une dominante d'herbe, avec de temps a autres une region d'arbre ou de terre. Pour ce faire, lors du choix des points centraux dans le diagramme de Voronoï (qui n'est, je le rappelle, pas un méchant dans Warframe), au lieu de prendre au hasard un des trois types, j'ai changé les chances de manière a avoir: 10% de chances d'avoir des arbres, 20% de chances d'avoir de la terre, et le reste de l'herbe. Ainsi on a une map plus propice a faire du jeu, sans avoir a déforester tout des le début (Déforestation new feature ?)

Vor un œil
Voronoi

 

Etape 2: de 2D a 3D

 

Généralités

Ensuite, le passage a la 3d s'est fait facilement. Il faut d'abord créer des objets, que l'on appelle prefabs, et qui vont représenter chaque type de terrain. Ensuite, on doit passer d'une map en texture en 2d vers une map en bloc en 3d. Il y a donc une nouvelle dimension, dans notre cas c'est la hauteur.
Dans unity, il faut savoir que l'axe vertical est l'axe y,  contrairement a d'autres logiciels. Pour passer de coordonnées 2D a des coordonnées 3D unity, il faut donc mettre pour chacun des points une valeur verticale identique. Ici j'ai choisi de les mettre simplement a hauteur 0. Ainsi, le point aux coordonnées (50, 50) en 2D deviendra le point (50, 0, 50) en 3D.
Une autre chose préalable à faire est la création d'objets représentant chaque type de sol. Dans Unity, un objet visé à être créé plusieurs fois est appelé un Prefab.


Les différents prefabs 

Au début, je voulais utiliser des assets pris sur le store, mais malheureusement j'ai appris que tout ce qu'on y prend, même gratuitement, ne doit pas être repartagé derrière. Et comme je veux que mon projet soit open-source et libre d'accès, ben j'ai tout fait a la mano. Pour l'herbe, j'ai créé une vieille texture sous Gimp et l'ai appliquée sur un cube. Je vous laisse admirer le résultat.


Idem pour la terre, avec une texture pareille mais en marron/orange.


Et le clou du spectacle, mon chef d’œuvre en trois actes, maitre parmi les maitres, le fabuleux arbre.
En fait c'est un bloc d'herbe sur lequel j'ai collé un cylindre avec la texture de terre, et par dessus j'ai mis un cercle de couleur vert foncée. Magnifique n'est-ce pas? (bon ok c'est temporaire)



La map en 3D 

Maintenant que tout est prêt, il ne reste plus qu'à se lancer. Pour passer la map en 3D, il faut donc parcourir notre tableau de points, et pour chacun, on instancie le Prefab correspondant au type de terrain du point, et on le positionne dans l'espace en suivant la méthode énoncée plus tôt. Voici plusieurs exemples de ce que la génération a pu donner.




Vous voyez, c'est quand même assez satisfaisant!


Etape 3: La sauvegarde

Pour la partie sauvegarde, je comme expliqué dans la partie Sauvegarde, il n'est pas possible sérializer les prefabs en eux même. A la place, j'ai stocké le tableau qui représente la map, donc un tableau à deux dimensions. Et dans ce tableau sont stockés des objets TileObject, expliqués la partie précédente, qui contiennent en fait la position de l'objet et le type de sol. Ainsi, lorsqu'on charge la map, il n'y a plus qu'a appliquer la même fonction que pour le passage à la 3D


Et voilà qui conclut le résumé. Comme toujours, j’espère que ça vous aura plu, n'hésitez pas à me faire part de vos idées ou questionnements si vous en avez.
Il est déjà tard ce soir et je galère depuis plus d'une heure avec des mises à jour, j'espère pouvoir faire ma session du jour mais rien n'est sûr. Sinon je rattraperais demain, mais c'est pas top. Enfin bref le prochain objectif, c'est de créer le système de grille, et je pense que ça va être du boulot. A toute sur l'autoroute.

Aucun commentaire:

Enregistrer un commentaire