Dofux Unitx - Dofus Open Source

Alpa

Membre
Inscrit
10 Octobre 2016
Messages
12
Reactions
39
#1
Parceque les x c'est le futur

Bonjour à tous !

Après avoir beaucoup travaillé avec les sources récentes de Dofus sous Flash, j'en ai eu marre et j'ai décidé de commencer un nouveau projet plus sympa.

Le project: refaire Dofus sous Unity, du moins dans les grandes lignes.

Le but n'est pas de reproduire Dofus Unity mais de réfléchir à chaque étape de développement comment le jeu pourrait être ammélioré et vu différement en se servant de tout ce qui est possible avec ce nouveau moteur de jeu.

Vu que je suis encore à la genèse du projet j'ai décidé de faire ce post et de le tenir à jour avec les avancées et les difficultés rencontré en essayant de vous expliquer au mieux comment marche Dofus sous Flash et comment ça à été pensé

Je suis très très débutant avec Unity donc le projet est aussi là pour me (et peut être et vous) faire apprendre !

Dans les grandes lignes où en est le projet à l'heure où j'écris ce post ?
Rien de plus que ce qui est sur cette vidéo

J'utilise Gaf pour exporter tout ce qui est Swf en Texture Atlas et fichier d'animation utilisable avec le plugin Gaf sur Unity

Dans les réponses à ce post j'expliquerais donc plus en détail techniquement chaque avancement du projet (passé et futur)

https://github.com/AlpaGit/dofux-unitx
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#2
Merci du partage :cool:
 

Alpa

Membre
Inscrit
10 Octobre 2016
Messages
12
Reactions
39
#3
Etape 1 : La création du plan de jeu


Bon, la première étape c'est de créer une grille en 2D isométrique, Unity à un component built-in pour ça mais ayant peur que ça ne soit pas assez permissif j’ai préféré coder ça moi même, de ce que j’ai vu c’est une pratique assez courante


Bon déjà la 2D isométrique, c’est quoi ?

Une cellule en 2D isométrique à (le plus souvent) un ratio de 2:1 c’est à dire que c’est 2 fois plus large que haut, sur Dofus 2 une cellule fait 43px de hauteur et 86px de largeur, pour connaître le milieu de la cellule il suffit de diviser ces deux valeurs par 2.

Petite recette pour créer un carré en 2D isométrique (ça nous servira à rien mais ça peut vous aider à visualiser)
  1. Faire un carré en 2D, par exemple 86x86
  2. Le tourner à 45°
  3. Diviser sa hauteur par 2
ezgif-5-6f0a1bd0c6.gif

Bravo, vous avez créé un carré en 2D isométrique ! (un losange quoi)

Sur Unity l’unité de mesure n’est pas en pixel, on fait un peu comme on veut mais par simplicité on va dire qu’on est en 1:100, 100 pixel = 1 unité


Maintenant que toutes les notions sont bien définies, on va construire une grille complète.

On crée un Empty Object sur une scène Unity, on crée un script “GridManager“ et on l’associe à l’objet.
Le script sera en Singleton pour faciliter son accès depuis d’autres scripts plus tard

Sur Dofus 2 la grille fait 14 cellules de large et 20 de hauteur, sauf qu’en isométrique il faut aussi compter les cellules impaires, donc on a 14 * 20 * 2, pour un total de 560 cellules, le compte est bon !

Pour me faciliter la vie je décide d’écrire une petite fonction qui me donnera la position exact en pixel d’une cellule en fonction de son numéro (id), par exemple la cellule 0 est tout en haut à gauche et la 559 est tout en bas à droite (0 à 559 ça fait 560 cellules btw)

C#:
public static PointF GetPixelCoordByCellId(int cellId)
{
   // Une division renvoi la position Y de la cellule
   var y = cellId / 14;
   // Le modulo renvoi la position X de la cellule
   var x = cellId % 14;

   var xInPx = col * 86;
   var yInPx = (float)-(line * (43 / 2));

   if (y % 2 != 0)
   {
       xInPx += 43;
   }


   yInPx += MaxHeight * 86f;
   return new PointF(x, y);
}
Pour que ça soit plus clair voilà une visualisation de X et Y sur la grille



Donc on a bien 14 cellules par lignes (X) et 20 * 2 = 40 par colonnes (Y)

Revenons au code rapidement
C#:
var yInPx = (float)-(line * (43 / 2));
Ce code fait que quand on descend d’une ligne, on descend d’une demi hauteur de pixel si vous avez bien suivis, vu que c’est isométrique, lors d’une nouvelle ligne le milieu de la prochaine ligne se trouve à la moitié de la hauteur de la cellule donc 21.5px.
C#:
var yInPx = (float)-(line * (43 / 2));
Unity décide que lorsqu’on on va vers le haut la valeur Y augmente, ce qui est plutôt contre intuitif vu que normalement le pixel 0,0 (x=0;y=0) sur une image c’est en haut à gauche, et si on descend Y monte, bref c’est l’inverse ici

Donc MaxHeight contient la hauteur maximum de la grille c’est à dire 20 * la hauteur d’une cellule donc 20 * 43 = 860, donc ça revert le grille, sinon ça serait la cellule en bas à gauche qui serait le 0,0, nous on veut que ça soit en haut a gauche !

La fonction renvoi donc à quel pixel se trouvera chaque cellule,
Il faudra pas oublier de diviser par 100 le résultat final pour utiliser le système de mesure d’Unity.

Maintenant créons la grille !

Dans notre script GridManager on créé une fonction Initialize()
Le principe est simple, pour chaque cellule on récupère sa position et on crée l’objet à partir de ça

On imagine quelque chose du genre

C#:
public void Initialize()
{
   const short numCells = 560;

   for (var cellId = 0; cellId < numCells; cellId++)
   {
       CreateCell(cellId);
   }
}

public static PointF GetSceneCoordByCellId(int cellId)
{
   var point = GetPixelCoordByCellId(cellId);
   return new PointF(point.X / 100f, point.Y / 100f);
}

private void CreateCell(short cellId)
{
   var point = GetSceneCoordByCellId(cellId);
   var posX = point.X;
   var posY = point.Y;

   // Chaque cellule sera contenu dans un GameObject
   var cell = new GameObject();

   // Le parent de chaque cellule sera la grille
   cell.transform.SetParent(gameObject.transform);

   // On positionne la cellule à sa position
   cell.transform.position = new Vector3(posX, posY, 0);
}
C’est déjà un bon début, par contre on y voit rien, il faudrait surement mettre un contour sur chaque cellule, on y rajoute donc un LineRenderer pour tracer des lignes !

C#:
var lr = cell.AddComponent<LineRenderer>();
lr.sortingLayerName  = "UI";
lr.sortingOrder      = 32700;
lr.startWidth        = 0.01f;
lr.endWidth          = 0.01f;
lr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
lr.receiveShadows    = false;
On doit créer un matérial avec un Shader pour la couleur du contour, on le mets blanc avec une opacité assez basse pour pas que ça soit trop moche

C#:
var transparentMaterial = new Material(Shader.Find("Sprites/Default"))
{
   color = new Color(1, 1, 1, 0.12f), // White with 12% opacity
};
On commence par créer une constance avec la taille d’une cellule avec la métrique d’Unity donc / 100f

C#:
const float cellWidth  = 0.86f;
const float cellHeight = 0.43f;
On veut créé 5 lignes sur le LineRenderer ! (0 à 1, 1 à 2, 2 à 3, 3 à 4) + 1 pour le début



posX et posY correspondent au milieu gauche de la cellule, donc le point 0 sur la figure au dessus
C#:
lr.SetPosition(0, new Vector3(posX, posY, 0));
On y ajoute la moitié de la largeur pour avoir le milieu et la moitié de la hauteur pour être en haut, super on a fait notre première ligne ! de 0 à 1
C#:
lr.SetPosition(1, new Vector3(posX + cellWidth / 2f, posY + cellHeight / 2f, 0));
Ensuite on fait de 1 à 2, donc c’est simple, on prendre juste la position de base et on y ajoute la taille de cellule pour aller de l’autre côté
C#:
lr.SetPosition(2, new Vector3(posX + cellWidth, posY, 0));
Bon je vous fais pas un dessin on ajoute pour le reste
C#:
lr.SetPosition(3, new Vector3(posX + cellWidth / 2f, posY - cellHeight / 2f, 0));
lr.SetPosition(4, new Vector3(posX, posY, 0));
Ensuite on va rajouter un PolygonCollider2D pour créer une hitbox de la cellule qui pourra être utilisée plus tard pour handle les cliques de la souris.

Et voilà ! On à vu pas à pas comment créer une grille 2D Isométrique, la prochaine étape sera de charger une map et ses tiles !
 
Inscrit
7 Septembre 2022
Messages
1
Reactions
0
#4
Stylé ! Merci du partage :) J'ai hâte de voir la suite =)
 
Inscrit
21 Mars 2023
Messages
6
Reactions
1
#5
Oh, ton projet semble vraiment passionnant ! J'espère sincèrement que tu vas le poursuivre. Si jamais tu as besoin de ressources supplémentaires en C#, n'hésite pas à me le faire savoir. J'ai développé un convertisseur pour passer du AS (ActionScript) à TypeScript et Python, et je peux également en créer un pour C#. On ne sait jamais, ça pourrait t'être utile !
 
Inscrit
30 Octobre 2019
Messages
78
Reactions
68
#6
Oh, ton projet semble vraiment passionnant ! J'espère sincèrement que tu vas le poursuivre. Si jamais tu as besoin de ressources supplémentaires en C#, n'hésite pas à me le faire savoir. J'ai développé un convertisseur pour passer du AS (ActionScript) à TypeScript et Python, et je peux également en créer un pour C#. On ne sait jamais, ça pourrait t'être utile !
il est open-source et dispo ton convertisseur AS -> TS ?
 
Inscrit
10 Octobre 2016
Messages
12
Reactions
39
#8
J'aurais surtout besoin de trouver comment bien gérer le système de bones des SWF des personnages actuellement, je suis toujours à la recherche d'une solution viable
 
Haut Bas