Alors comme ça, tu veux créer un inventaire dans ton jeu mais tu ne sais pas comment faire?
Ne t’en fais pas! Ce guide est là pour t’apprendre comment te servir de l’outil magique qu’est le ScriptableObject pour compter, ajouter et afficher des objets!
Voici les quelques notions que tu vas découvrir dans ce guide:
Tu as eu tout le loisir d’expérimenter avec les composants dans Unity, mais ces derniers se retrouvent assez limités quand il s’agit de stocker des données, comme on le ferait pour un inventaire! Les ScriptableObjects nous permettent de créer des assets qui vont stocker les différents objets de ton inventaire. Tu n’auras plus qu’à les assigner là où tu en as besoin, que ce soit pour ajouter un objet, ou pour l’afficher!
Pour comprendre la suite de cette page, nous te recommandons fortement d’aller lire le guide sur les Scriptable Objects puisque le système d’inventaire repose énormément sur cette nouvelle notion!
Bien! Maintenant que tu sais ce qu’est un ScriptableObject, il est temps d’en créer un qui te servira de modèle pour tes objets! Chaque objet sera défini par les mêmes variables mais ils auront chacun des valeurs différentes!
Pour le cas de ton inventaire par exemple, tu veux un ScriptableObject qui puisse stocker ces trois choses:
Voici à quoi ressemblerait le script!
Parce que c’est un ScriptableObject, il ne peut pas être attaché en composant des objets!
using UnityEngine; |
Tu peux remarquer ceci:
Maintenant que tu as pu coder le modèle avec la liste de variables qui t’intéresse, tu peux créer tes objets dans les dossier l’onglet Projet! Jette un nouveau coup d’œil au guide sur les ScriptableObjects si tu ne sais pas comment faire!
Dans cet exemple, ça serait:
Clic droit dans tes assets > Create > Magic RPG > Item
Tu peux créer autant d’objets que tu veux, mais pour ce début de projet nous allons simplement créer un objet Piece! Cet asset servira à compter le nombre de pièces que possède ton joueur!! Tu peux lui assigner le nom de ta monnaie et une belle icône.
Ce que tu as vu plus haut n’était que pour stocker les données, mais pour représenter tes items en jeu il va te falloir un prefab!
Crée un prefab de Pièce que tu vas pouvoir ajouter un peu partout sur la scène!
Le prefab de la pièce doit contenir un sprite et un Collider2D en trigger! Le collider permettra de détecter la collision avec le joueur.
Tu as créé et placé tes objets mais comment faire pour les compter? Tu aimerais bien que lorsque ton joueur touche un item, cela le détruise et s’ajoute au compteur de ton ScriptableObject! Rien de plus simple:
Sur le prefab de ton objet (la pièce dans l’exemple), ajoute un nouveau script en tant que composant.
public class RamasseItem : MonoBehaviour |
Sans oublier d’assigner le bon objet dans l’inspecteur
Et le tag Player sur le joueur
Désormais, lorsque tu lances le jeu et que ton joueur touchent les pièces, deux choses devraient arriver en même temps:
Ça y est! Tu sais comment ramasser des objets! Mais cela n’est pas très amusant si on ne voit pas directement dans le jeu le nombre de pièces… Pour cela, il te faudra afficher l’inventaire dans l’UI!
Généralement dans les jeux, on parle d’inventaire pour désigner les écrans qui affichent tous les objets ramassés par le joueur! Normalement en suivant ce guide, tu as vu comment stocker tes objets à l’aide des ScriptableObjects. La seule chose qui reste à faire est de les afficher dans l’UI.
Petit rappel sur l’interface utilisateur (aussi appelé UI) et comment afficher une variable à l’écran.
Puisque tu vas vraisemblablement ajouter plusieurs objets à ton inventaire, laisse-nous te présenter une méthode qui te permet d’exploiter pleinement les prefabs pour te simplifier la vie.
Commence par créer le canvas qui servira à contenir tout ton inventaire. Tu peux te référer aux ressources sur l’interface utilisateur.
A l’intérieur du canvas, crée un GameObject vide qui te servira à contenir tous tes emplacements d’inventaire. A l’intérieur de cet objet vide, crée un autre objet vide qui servira quant à lui d’emplacement d’inventaire.
Un emplacement d’inventaire est composé d’une image représentant l’icône de l’objet, d’un comptant la quantité ramassée, et éventuellement un panel qui sert de fond.
Tu vas pouvoir faire de cet emplacement d’inventaire un prefab! Cela t’évitera de recréer un emplacement d’inventaire pour chaque objet!
Remarque: utilise TextMeshPro pour le texte! Unity va te demander d’importer TextMeshPro, alors fais-le! Tu n’as pas besoin d’importer les exemples par contre 😉
Malheureusement, même si tu ramasses des objets, tu ne risques pas de voir le compteur changer sur ton écran. Ce n’est qu’un texte fixe. Pour le mettre à jour en temps réel, il va falloir le lier en temps réel avec le ScriptableObject correspondant!
Dans le prefab de l’emplacement d’inventaire, ajoute un nouveau script EmplacementInventaire.
using UnityEngine; |
Assigne les variables publiques dans l’inspecteur:
Si tout se passe bien, tu devrais voir le compteur se mettre à jour dès que tu lances le jeu!
Si tu as bien compris le principe, tu peux même mettre à jour l’icône automatiquement en fonction de l’icône contenu dans ton scriptableObject! Cela repose sur le même principe que remplacer le texte sauf que tu veux remplacer une image par une autre!
Comme l’emplacement que tu as fait est un prefab, il suffit d’en glisser d’autres ou de le dupliquer pour créer de nouveaux emplacements! Modifie l’image avec celle que tu veux et surtout change l’item référencé par un autre!
Tu as remarqué que ton compteur ne se remet pas à zéro entre les parties? C’est normal! Si tu as bien lu le guide sur les ScriptableObjects, tu devrais savoir que tes objets existent en dehors de la scène! Ils persistent donc même si tu quittes la scène.
Si tu tiens à ce que tes objets se remettent à zéro à chaque fois que tu appuies sur le bouton play, il va falloir créer un script pour s’occuper de ça!
public class ResetItem : MonoBehaviour |
La dernière chose qui reste à faire est d’activer et de désactiver l’inventaire en cliquant sur un bouton. Imaginons par exemple que tu souhaites afficher l’inventaire en appuyant sur la touche I de ton clavier!
Tu peux te référer au guide sur les inputs pour mieux comprendre comment détecter les entrées de ta manette.
Attache ce script à un objet vide ou bien directement à ton canvas!
public class AfficherInventaire : MonoBehaviour |
Assigne bien dans l’inspecteur l’objet UI que tu souhaites montrer/masquer.