Ressources Magic Makers

 

Site en maintenance

 
Nous sommes actuellement entrain de mettre à jour les ressources de ce site.
Pendant la mise à jour vous pouvez retrouver tous les nouveaux contenus sur le site
 

https://lp-magicmakers.fr/

 
 

Créer des assets avec les ScriptableObjects

Un Scriptable Object est un objet scriptable dans Unity qui permet de stocker des données. C’est un conteneur de données qui peut être utilisé pour stocker toutes sortes d’informations, telles que des paramètres de jeu, des objets d’inventaire, des statistiques de joueur, etc.

Guide vidéo

A quoi ça sert?

Jusqu’ici tous tes scripts n’ont été que pour créer des composants. Tu les ajoutes à une objet qui existe déjà dans la scène afin de modifier leur comportement. Mais quand il s’agit de stocker des données persistantes, comme des objets d’inventaire, des dialogues ou des réglages, c’est souvent bien plus pratique de les manipuler directement dans les assets à l’aide des ScriptableObject! 

Un ScriptableObject est comme un modèle d’asset que tu vas pouvoir instancier et manipuler directement depuis tes assets! 

En bref, les ScriptableObjects sont un excellent moyen de stocker des données dans Unity et de les rendre facilement accessibles à la fois pour le développeur et le joueur.

Comment créer un ScriptableObject?

Exemple de ScriptableObject

1/ Coder un modèle de ScriptableObject en C#

La première étape consiste à créer un script qui servira de modèle pour notre ScriptableObject! 

using UnityEngine;

[CreateAssetMenu(fileName = « Objet », menuName = « Magic RPG/Objet »)]
public class Item : ScriptableObject
{
    public string itemName;
    public Sprite itemIcon;
    public int itemID;
    public string itemDescription;
    public int itemValue;
}

Il y a plusieurs choses à faire remarquer par rapport à un script ordinaire:

  • On remplace MonoBehaviour par ScriptableObject. Cela veut dire que ce script ne sera pas utilisé comme composant d’un objet (comme on le fait d’habitude) mais comme un modèle de ScriptableObject.
  • On déclare une liste de plusieurs variables publiques qu’on veut voir apparaître dans nos objets! On pourra assigner leur valeur au moment de créer chaque objet!
  • Le dernier élément frappant, c’est ce CreateAssetMenu étrange! On le met au-dessus d’un ScriptableObject parce qu’il nous permet de l’afficher dans le menu déroulant de Unity pour le rendre accessible facilement
    • Le champ fileName décide du nom par défaut que prend l’asset quand il est créé
    • Le champ menuName décide de l’emplacement et du ScriptableObject dans le menu déroulant

Dans cet exemple, on a placé le ScriptableObject dans le menu “Magic RPG/Objet” !

 

2/ Créer des instances du ScriptableObject dans les dossiers Assets

Pour créer une instance de cet objet, tu peux simplement cliquer avec le bouton droit de la souris dans l’onglet Projet et sélectionner « Create → Magic RPG → Item ». Cela créera une nouvelle instance de l’objet scriptable qui peut être modifiée indépendamment des autres instances.

3/ Paramétrer le ScriptableObject

Maintenant que tu as plusieurs Assets dérivés de ton ScriptableObject, tu peux les paramétrer un à un dans l’inspecteur!

Cela consiste à remplir les champs vides de chaque objet que tu as créé! 

Comment utiliser un ScriptableObject?

Tu peux considérer un ScriptableObject comme un objet qui vit en dehors de ta scène. Tu peux l’assigner à n’importe quel composant pour qu’il puisse en lire et modifier les variables publiques! 

Ce script par exemple, va ajouter un à l’objet assigné à chaque fois que je démarre le jeu:

public class AjouterObjet : MonoBehaviour
{
    public Item monObjet;

    private void Start()
    {
        monObjet.quantite += 1;
    }
}

Item est le nom du modèle du ScriptableObject défini plus haut. Ça peut être Quest, Dialogue ou Power à la place! Tout dépend du type de ScriptableObject que tu as défini!

quantite est l’une des variable publiques définie à l’intérieur du ScriptableObject. C’est cette variable que nous souhaitons affecter dans cet exemple!

Il suffit d’assigner le bon Asset de type Item dans l’inspecteur et il sera affecté à chaque fois que tu lances le jeu

Pourquoi mes valeurs ne se remettent pas par défaut?

Remarque ce qu’il se passe quand tu lances le jeu plusieurs fois de suite: La valeur du ScriptableObject continue d’augmenter sans se réinitialiser même une fois qu’on arrête le jeu! ⚠️

C’est parce que les ScriptableObjects existent en dehors de la scène! Ils ne sont donc pas remis par défaut quand on quitte la scène! 

C’est très pratique pour garder des informations d’une scène à l’autre (comme l’inventaire) mais si tu souhaites remettre tout à zéro à chaque fois que la scène se lance, il faudra coder spécifiquement un script qui s’en occupe! 

Exemple: 

public class ResetItem : MonoBehaviour
{
    public Item item;

    void Start()
    {
        item.quantite = 0;
    }
}