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.
Défi
MoyenDéplace les paramètres du héros dans un asset de données.
- Dans
HeroData.cs, écrispublic class HeroData : ScriptableObjectavec les champs publicsstring heroName,float moveSpeedetColor color. - Place
[CreateAssetMenu(menuName = "Heroes/Hero Data")]sur la ligne au-dessus. - Dans
Hero.cs, remplace les trois champs parpublic HeroData data;et lis plutôtdata.heroName,data.moveSpeedetdata.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
1Des composants, pas des hiérarchies
De petits composantsUn script de base pour les ennemisComposants abstraitsDes composants qui fonctionnent ensembleRécapitulatif : tourelle modulaireRécapitulatif : canon double4Données sérialisées
Classes sérialisablesListes dans l’InspecteurÉnumérations dans l’InspecteurRécapitulatif : table de butinRécapitulatif : tirer le butin2Les interfaces dans Unity
IDamageableInterfaces et TryGetComponentGetComponentsRécapitulatif : touche d’interactionLe plus proche à portée5ScriptableObjects
Ressources de donnéesStatistiques des armesParamètres partagésSauver le ventLes vagues comme donnéesRécapitulatif : base de données des objetsRécapitulatif : acheter dans la boutique3Événements
Les événements C# dans UnityS’abonner dans OnEnableChamps UnityEventLes événements pilotent l’interfaceRécapitulatif : fenêtre de succèsRécapitulatif : minuteur de la fenêtreEntraînez-vous par vous-même : Playground Unity