Fichiers XML et Unity

Tutoriel – utiliser les fichiers XML dans Unity3D

Dans ce tutoriel, nous allons voir comment utiliser des fichiers XML (Extensible Markup Language), pour charger ou sauvegarder une configuration et des objets.

Un des avantages d’utiliser ce genre de fichier, ou un autre format comme les JSON  par exemple; c’est qu’ils vous permettent de configurer facilement vos niveaux, ennemis ou objets.

Comme dit plus haut, notre fichier XML va nous permettre de structurer notre projet.
En C#, il existe des outils pour convertir ces fichiers en classe, que nous pourrons utiliser par la suite.

Création des classes gérant un fichier XML

Le fichier suivant va nous servir de base pour le tutoriel. Dans votre projet Unity3D, ajoutez un dossier Personnage à la racine des ressources, puis ajoutez un fichier personnages.xml.

Ci-dessous, le contenu du fichier :


<!--?xml version="1.0" encoding="utf-8" ?-->
<Equipe>
<Personnage name="Alex" hp="10" mp="5">
<Classe>Chevalier</Classe>
</Personnage>
<Personnage name="Fayt" hp="5" mp="8">
<Classe>Archer</Classe>
</Personnage>
</Equipe>

Dans ce fichier, rien de sorcier. Il s’agit d’une équipe qui est composée de plusieurs personnages.
Chaque personnage possède un attribut nom, hp, mp et une classe.

Pour lire ce fichier dans Unity3D en C#, nous allons d’abord créer une classe Personnage dans le dossier que nous avons créé précédemment. Elle servira à charger toutes les données d’un personnage.

using System.Xml.Serialization;
public class Personnage {
[XmlAttribute("name")] public string Name;
[XmlAttribute("hp")] public int Hp;
[XmlAttribute("mp")] public int Mp;
public string Classe;
}

Les trois premières lignes avec XmlAttribute permettent de récupérer les valeurs name, hp et mp dans la balise Personnage. Pour récupérer l’élément Classe, il suffit de déclarer une variable ayant le même nom.

Maintenant nous allons créer une autre classe qui elle va gérer l’équipe. Nous la nommerons Equipe.

using System.IO;
using System.Xml.Serialization;
using System.Collections.Generic;
 
[XmlRoot("Equipes")]
public class Equipe{
[XmlArray("Equipe"), XmlArrayItem("Personnage")]
public List<Personnage> Personnages;

private Equipe(){}

public static Equipe LoadFromFile(string filepath){
 XmlSerializer serializer = new XmlSerializer(typeof(Equipe));
 using(FileStream stream = new FileStream(filepath, FileMode.Open))
 {
 return serializer.Deserialize(stream) as Equipe;
 }
} 
}

Nous venons de créer la classe qui chargera le fichier XML et qui le convertira en classes. Les éléments Personnage sont convertis en liste, parce qu’une équipe peut posséder plusieurs membres.

Quelques petites explications sur le code de la classe Equipe :

  • XmlRoot définit la racine du fichier.
  • XmlArray définit un tableau d’élément. Dans ce cas-là, il s’agit de notre équipe.
  • XmlArrayItem définit le type d’élément se trouvant dans le tableau.

La méthode LoadFromFile, comme son nom l’indique, va charger un fichier en fonction du chemin que l’on renseigne. Elle nous retournera ensuite un objet avec toutes les informations du XML.

Pour utiliser la classe que nous avons créée, il faut utiliser le code suivant :

Equipe equipe = Equipe.LoadFromFile(Application.dataPath + "/Personnage/personnages.xml");
// Debugger la variable
Debug.Log(equipe.Personnages[0].name);

Application.dataPath correspond à la racine du dossier Assets de votre projet Unity3D;

Sauvegarder un fichier XML

Maintenant que nous savons charger un fichier, nous allons voir comment sauvegarder. Pour cela, retournons dans la classe Equipe et ajoutons la méthode suivante : Save.

using System.IO;
using System.Xml.Serialization;
using System.Collections.Generic;

[XmlRoot("Equipes")]
public class Equipe{
[XmlArray("Equipe"), XmlArrayItem("Personnage")]
public List<Personnage> Personnages;
private Equipe(){}
public static Equipe LoadFromFile(string filepath){
XmlSerializer serializer = new XmlSerializer(typeof(Equipe));
using(FileStream stream = new FileStream(filepath, FileMode.Open))
{
return serializer.Deserialize(stream) as Equipe;
}
}
public void Save(string path){
XmlSerializer serializer = new XmlSerializer(typeof(Equipe));
using(FileStream stream = new FileStream(path, FileMode.Create)){
serializer.Serialize(stream, this);
}
}
}

Cette méthode sauvegardera le fichier XML dans le chemin que vous renseignez.

Pour sauvegarder un fichier :

equipe.Save(Application.persistantDataPath + "/personnages.xml");

Application.persistantDataPath correspond au dossier où votre application est autorisée à stocker des fichiers.

Conclusion

Comme vous pouvez le voir, utiliser les fichiers XML permet d’alléger le nombre de scènes de votre projet Unity3D via la configuration.

De plus, cela vous ouvre de nombreuses possibilités de simplification de votre projet.

Dans mon cas, pour un de mes projets, j’ai configuré l’apparition des ennemis  et leur position d’apparition dans des fichiers XML.

Les fichiers sources C# sont disponibles ici. N’hésitez pas à me laisser un commentaire si vous avez des questions ou des suggestions pour améliorer ce tutoriel ou bien pour que je traite d’un autre sujet.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *