Menu
CoddyTech

Assets de données

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

Un jeu de ferme fait pousser des carottes et des citrouilles. Une carotte pousse pendant 30 secondes et se vend 5 pièces, une citrouille pousse pendant 90 secondes et se vend 40 pièces. Ces nombres appartiennent à la culture, pas à une plante individuelle : en tant que champs de l’Inspector dans un script Plant, chaque carotte de chaque scène possède sa propre copie de 30 et de 5, et toute modification oblige à les retrouver toutes. Un ScriptableObject conserve ce type de données dans un asset, un fichier du projet auquel n’importe quel nombre d’objets peut faire référence. Sa classe dérive 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 doit se trouver dans un fichier portant son nom, PlantData.cs.

Le comportement reste dans un MonoBehaviour qui possède un champ du type de l’asset. Faites glisser l’asset Carrot sur ce champ, et le script accède aux 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 n’est associé à aucun GameObject et ne se trouve 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, et Plant contient le comportement. Lorsque 200 carottes font référence à l’unique asset Carrot, définir son growTime à 25 modifie les 200. En code, une instance se crée avec ScriptableObject.CreateInstance<PlantData>(), jamais avec new.

challenge icon

Défi

Moyen

Le héros se déplace dans l’arène à l’aide des flèches. Son nom, sa vitesse et sa couleur sont des champs du script Hero, et chaque nouveau héros les copierait à nouveau. Déplace-les dans un asset :

  • Dans HeroData.cs, écris HeroData, un ScriptableObject avec les champs publics heroName (une chaîne), moveSpeed (un float) et color (un Color). Ajoute-lui [CreateAssetMenu] avec le nom de menu Heroes/Hero Data.
  • Dans Hero.cs, remplace les trois champs par un seul champ public data de type HeroData, et utilise les valeurs de l’asset là où le script utilisait ses propres valeurs.

Le projet contient un asset Knight créé avec ce menu (Knight, vitesse 3, rouge), et l’Inspector le place dans le champ data du héros. Appuie sur Play et déplace Knight dans l’arène, puis clique sur Check.

Essayez vous-même

using UnityEngine;

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

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Architecture de jeu dans Unity