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" ?–>
<Equipes>
<Equipe>
<Personnage name="Alex" hp="10" mp="5">
<Classe>Chevalier</Classe>
</Personnage>
<Personnage name="Fayt" hp="5" mp="8">
<Classe>Archer</Classe>
</Personnage>
</Equipe>
</Equipes>
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.
4 réponses sur « Tutoriel – utiliser les fichiers XML dans Unity3D »
Bonjour,j e dois générer des objets sons depuis un fichier xml ou les positions et les noms de ces objets me seront passés en paramètres, est-il possible de voir vos codes sources quant à la génération de vos ennemis ? Merci d’avance.
Oui pas de soucis, le code source est ici : http://blog.bfrancois.com/wp-content/uploads/2016/08/Tutoriel-XML-Unity3D.zip
Pour les ennemis, c’est exactement le même principe que pour les personnages. Il faudra juste créer la classe et les paramètres nécessaires. Puis pour les charger, s’inspirer de ça :
Equipe equipe = Equipe.LoadFromFile(Application.dataPath + « /Personnage/personnages.xml »);
// Debugger la variable
Debug.Log(equipe.Personnages[0].name);
Merci pour l’article, ça m’a bien aidé à centralisé mes ressources textes. Attention toutefois je crois qu’il faut rajouter la balise englobant le tout (elle apparaît dans ton ficher mais pas dans les extraits de code de l’article)
Perso j’ai utilisé le dossier des /Resources de Unity ; je suis pas sûr que ça fasse une grosse différence mais la récupération du fichier est simplifiée : Resources.Load(« nomFichier »).
Merci pour ton retour, j’ai corrigé :).
Tu as raison, c’est mieux d’utiliser le dossier Resources d’Unity.