mercredi 27 juin 2018

[Unity3D][Défi50Jours] Jour 9 - amélioration des routes

Salut les petits protozoaires euclidiens c'est l'heure de l'update numéro 2 après 7 !


Hier, on avait fait des routes, en utilisant A*. A la fin ça marchait, sauf qu'on n'avait que des diagonales, et ce n'est pas très optimal pour un jeu de gestion de ville. Dans ma dernière session, je me suis donc attaqué à les rendre moins diagonales et plus réaliste.

Pour ça, il a fallu faire quelques modifications sur notre classe Noeud. Souvenez vous, jusqu'ici il comportait sa position, son coût et une référence vers le noeud qui le précède. Ce que nous allons faire ici, c'est altérer la fonction de calcul de coût, notre Heuristique, pour que ce coût soit plus élevé lors d'un changement de direction. Pour ce faire il a simplement fallu ajouter un champ direction à notre objet Noeud. Puis, dans le calcul du coût, si la direction du noeud actuel est différente de celle de son noeud parent, alors on augmente la valeur du coût. Ici j'ai arbitrairement ajouté une valeur de 10.
Ce qui a pour effet que le noeud choisi sera toujours dans la même direction que le noeud précédent, sauf en cas de rencontre d'obstacle, ou si le chemin devient vraiment plus rapide en tournant.


L'étape d'après a été de faire en sorte de ne pas prendre en compte les obstacles. Pour ça, rien de plus simple, lorsque l'on récupère les voisins d'un noeud, si l'un des voisins est un obstacle, on l'ignore.
Maintenant, on a des belles routes qui serpentent à travers la forêt.

Ensuite, j'ai créé une sublime texture de route via Gimp, et l'ai appliquée au préfab de route. Le résultat est plutôt pas mal, même si j'ignore pourquoi la bande blanche se répète sur les six faces du
pavé.

La super texture de route
La super route

Une fois fais, j'ai fais en sorte qu'à la création de la map, deux points soient sélectionnés aléatoirement, en faisant attention à ce que ce ne soient pas des obstacles, puis j'ai tracé une route entre ces deux points. Et voilà un exemple de résultat:

Random route

Sympa non? Pour les plus observateurs, il reste encore un léger souci: les routes sont toutes orientées dans le même sens, et du coup discontinues... Mince, comment faire? Oh zut je me demande...
Hé bien vous vous souvenez de cette variable direction ajoutée au noeud? Il suffit d'orienter la route en fonction de cette direction et le tour est joué :) Par défaut, la route est posée de telle sorte que sa longueur soit à l'horizontale. Pour les directions gauche et droite, il n'y a rien à faire en plaçant la route, et pour les directions haute et basse, une simple rotation de 90 degrés suffit. Ensuite on lance, et TADAAAA.

Random route mais mieux

Voilà, une vraie route (bon mis à part les angles mais on verra ça plus tard). Ca fait bien plaisir, et en seulement 9 jours de dev, on a un résultat visible, assez propre, et plutôt bien satisfaisant. La prochaine étape sera de mettre en place la sauvegarde de ces routes, puis de faire en sorte de pouvoir placer les routes avec un clic long de la souris. Et on aura fini avec les routes ! :)

Je suis assez excité pour ce qu'il y a à venir, et j'espère que vous aussi. Comme d'habitude, n'hésitez pas à me faire part de vos remarques ou questions si vous en avez, et si vous aussi voulez vous lancer un défi de ce genre, foncez, car ça fait vraiment du bien de voir un projet se construire ainsi.



Sur ce des bisous carabistouillés.

Aucun commentaire:

Enregistrer un commentaire