Menu
CoddyTech

Ressources de données

Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 23 sur 64.

Un jeu de ferme permet de faire pousser des carottes et des citrouilles. Une carotte pousse pendant 30 secondes et se vend 5 pièces, tandis qu’une citrouille pousse pendant 90 secondes et se vend 40 pièces. Ces nombres appartiennent à la culture, pas à une plante en particulier : en tant que champs de l’Inspector dans un script Plant, chaque carotte de chaque scène possède sa propre copie des valeurs 30 et 5, et pour les modifier, il faut toutes les retrouver. Un ScriptableObject conserve ces données dans un asset, un fichier du projet vers lequel n’importe quel nombre d’objets peut pointer. Sa classe hérite de ScriptableObject au lieu de MonoBehaviour :

using UnityEngine;

[CreateAssetMenu(fileName = "NewPlant", menuName = "Farm/Plant Data")]
public class PlantData : ScriptableObject
{
    public string plantName;
    public float growTime;
    public int sellPrice;
}

[CreateAssetMenu] ajoute la classe au menu Create de la fenêtre Project. Faites un clic droit dans la fenêtre Project, choisissez Create > Farm > Plant Data, et Unity crée un asset nommé NewPlant ; renommez-le Carrot, sélectionnez-le et saisissez Carrot, 30 et 5 dans ses champs de l’Inspector. Un asset Pumpkin se crée de la même manière. Comme pour un MonoBehaviour, la classe se trouve dans un fichier qui porte son nom, PlantData.cs.

Le comportement reste dans un MonoBehaviour doté d’un champ du type de l’asset. Faites glisser l’asset Carrot sur ce champ, et le script lit les nombres par son intermédiaire :

public class Plant : MonoBehaviour
{
    public PlantData data;
    private float age;

    void Update()
    {
        age += Time.deltaTime;
        if (age >= data.growTime)
        {
            Debug.Log(data.plantName + " is ready, worth " + data.sellPrice);
            enabled = false;
        }
    }
}

Un ScriptableObject ne se trouve sur aucun GameObject ni dans aucune scène. Il n’a pas de Transform, et Unity n’appelle jamais ses méthodes Update ou Start : il contient les données, tandis que Plant contient le comportement. Lorsque 200 carottes pointent vers le même asset Carrot, régler son growTime sur 25 modifie les 200. En code, une instance se crée avec ScriptableObject.CreateInstance<PlantData>(), jamais avec new.

challenge icon

Défi

Moyen

Déplace les paramètres du héros dans un asset de données.

  1. Dans HeroData.cs, écris public class HeroData : ScriptableObject avec les champs publics string heroName, float moveSpeed et Color color.
  2. Place [CreateAssetMenu(menuName = "Heroes/Hero Data")] sur la ligne au-dessus.
  3. Dans Hero.cs, remplace les trois champs par public HeroData data; et lis plutôt data.heroName, data.moveSpeed et data.color.

Appuie sur « Jouer » : le Chevalier rouge marche à la vitesse 3. Puis appuie sur « Vérifier ».

Essayez vous-même

using UnityEngine;

// HeroData : le nom, la vitesse et la couleur du héros, sous forme de ScriptableObject

Toutes les leçons de Architecture de jeu dans Unity

Entraînez-vous par vous-même : Playground Unity