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.
Défi
MoyenLe 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, écrisHeroData, un ScriptableObject avec les champs publicsheroName(une chaîne),moveSpeed(un float) etcolor(un Color). Ajoute-lui[CreateAssetMenu]avec le nom de menuHeroes/Hero Data. - Dans
Hero.cs, remplace les trois champs par un seul champ publicdatade 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
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
1Des composants, pas des hiérarchies
Des composants simplesUn script de base pour les ennemisDes composants abstraitsDes composants qui fonctionnent ensembleRécapitulatif : tourelle modulaire4Données sérialisées
Classes sérialisablesListes dans l’inspecteurÉnumérations dans l’inspecteurRécapitulatif : table de butin7Machines à états
Les états sous forme de classesUne machine à étatsTransitionsLes cerveaux des ennemisRécapitulatif : états d’une porte10Projet : Survivant de l’arène
Le hérosTypes d’ennemis2Interfaces dans Unity
IDamageableInterfaces et TryGetComponentGetComponentsRécapitulatif : touche d’interaction5ScriptableObjects
Assets de donnéesStatistiques des armesParamètres partagésLes vagues sous forme de donnéesRécapitulatif : base de données d’objets