• Jeux
  • Industrie
  • Ressources
  • Communauté
  • Apprentissage
  • Assistance
Développement
Moteur Unity
Créez des jeux 2D et 3D pour n'importe quelle plateforme
TéléchargerOffres et tarifs
Monétisation
Achat intégré (IAP)
Découvrez et gérez les IAP à travers les magasins
Mediation
Maximisez les revenus et optimisez la monétisation
Qualité des annonces
Protégez l'expérience utilisateur de votre application
Tapjoy
Construisez une fidélité utilisateur à long terme
Tous les produits de monétisation
Acquisition de nouveaux joueurs
Acquisition de nouveaux joueurs
Faites-vous découvrir et acquérez des utilisateurs mobiles
Unity Vector AI
Connectez les joueurs avec les bons jeux
Aura publicité sur appareil
Atteignez les utilisateurs sur l'appareil au moment de l'engagement maximal
Tous les produits de croissance
Cas d’utilisation
Collaboration 3D
Construisez et révisez des projets 3D en temps réel
Formation immersive
Entraînez-vous dans des environnements immersifs
Expériences client
Créez des expériences interactives 3D
Toutes les solutions sectorielles
Secteurs
Fabrication
Atteindre l'excellence opérationnelle
Distribution
Transformer les expériences en magasin en expériences en ligne
Automobile
Élever l'innovation et les expériences en voiture
Tous les secteurs
Bibliothèque technique
Documentation
Manuels d'utilisation officiels et références API
Outils de développement
Versions de publication et suivi des problèmes
Feuille de route
Examiner les fonctionnalités à venir
Glossaire
Bibliothèque de termes techniques
Informations
Études de cas
Histoires de succès dans le monde réel
Guides des meilleures pratiques
Conseils et astuces d'experts
Toutes les ressources
Nouveautés
Blog
Mises à jour, informations et conseils techniques
Actualités
Actualités, histoires et centre de presse
Centre communautaire
Discussions
Discuter, résoudre des problèmes et se connecter
Événements
Événements mondiaux et locaux
Histoires de la communauté
Made with Unity
Mise en avant des créateurs Unity
Diffusions en direct
Rejoignez les développeurs, créateurs et initiés
Unity Awards
Célébration des créateurs Unity dans le monde entier
Pour tous les niveaux
Unity Learn
Maîtrisez les compétences Unity gratuitement
Formation professionnelle
Améliorez votre équipe avec des formateurs Unity
Vous découvrez Unity ?
Démarrer
Démarrez votre apprentissage
Parcours essentiels Unity
Vous découvrez Unity ? Commencez votre parcours
Guides pratiques
Conseils pratiques et meilleures pratiques
Formation
Pour les étudiants
Démarrez votre carrière
Pour les enseignants
Boostez votre enseignement
Licence d'enseignement subventionnée
Apportez la puissance de Unity à votre institution
Certifications
Prouvez votre maîtrise de Unity
Options d'assistance
Obtenir de l'aide
Vous aider à réussir avec Unity
Plans de succès
Atteignez vos objectifs plus rapidement avec un support expert
FAQ
Réponses aux questions courantes
Contactez-nous.
Connectez-vous avec notre équipe
Offres et tarifs
Langue
  • English
  • Deutsch
  • 日本語
  • Français
  • Português
  • 中文
  • Español
  • Русский
  • 한국어
Réseaux sociaux
Devise
Acheter
  • Produits
  • Unity Ads
  • Abonnement
  • Asset Store Unity
  • Revendeurs
Formation
  • Participants
  • Formateurs
  • Établissements
  • Certification
  • Formation
  • Programme de développement des compétences
Télécharger
  • Hub Unity
  • Télécharger des archives
  • Programme version Bêta
Unity Labs
  • Laboratoires
  • Publications
Ressources
  • Plateforme d'apprentissage
  • Communauté
  • Documentation
  • Unity QA
  • FAQ
  • État des services
  • Études de cas
  • Made with Unity
Unity
  • Notre entreprise
  • Newsletter
  • Blog
  • Événements
  • Carrières
  • Aide
  • Presse
  • Partenaires
  • Investisseurs
  • Affiliés
  • Sécurité
  • Impact sociétal
  • Inclusion et diversité
  • Contactez-nous.
Copyright © 2025 Unity Technologies
  • Mentions légales
  • Politique de confidentialité
  • Cookies
  • Ne vendez ou ne partagez pas mes informations personnelles

« Unity », ses logos et autres marques sont des marques commerciales ou des marques commerciales déposées de Unity Technologies ou de ses filiales aux États-Unis et dans d'autres pays (pour en savoir plus, cliquez ici). Les autres noms ou marques cités sont des marques commerciales de leurs propriétaires respectifs.

Hero background image

Séparer les données de jeu et la logique avec ScriptableObjects

Cette page a été traduite automatiquement pour faciliter votre expérience. Nous ne pouvons pas garantir l'exactitude ou la fiabilité du contenu traduit. Si vous avez des doutes quant à la qualité de cette traduction, reportez-vous à la version anglaise de la page web.
Cliquez ici.

Cette page explique comment utiliser les ScriptableObjects comme conteneurs de données qui séparent les données de la logique dans votre code de jeu.

Ceci est le deuxième d'une série de six mini-guides créés pour aider les développeurs Unity avec la démo qui accompagne l'e-book, Créer une architecture de jeu modulaire dans Unity avec ScriptableObjects.

La démo est inspirée par les mécaniques de jeu d'arcade classiques de balle et de palette, et montre comment les ScriptableObjects peuvent vous aider à créer des composants qui sont testables, évolutifs et conviviaux pour les concepteurs.

Ensemble, l'e-book, le projet de démo et ces mini-guides fournissent les meilleures pratiques pour utiliser les modèles de conception de programmation avec la classe ScriptableObject dans votre projet Unity. Ces conseils peuvent vous aider à simplifier votre code, réduire l'utilisation de la mémoire et promouvoir la réutilisabilité du code.

Cette série comprend les articles suivants :

  • Commencer avec la démo Unity ScriptableObjects
  • Utiliser des énumérations basées sur ScriptableObject dans votre projet Unity
  • Utiliser des ScriptableObjects comme objets délégués
  • Utiliser des ScriptableObjects comme canaux d'événements dans le code de jeu
  • Comment utiliser un ensemble d'exécution basé sur ScriptableObject
  • Remarque importante avant de commencer
  • Conteneurs de données
  • Flux de travail général
  • ScriptableObjects contre MonoBehaviours
  • Démo de modèles
  • Stockage des données de jeu avec le modèle flyweight
  • Données de jeu PaddleBallSO
  • Exemple de double sérialisation : Mises en page de niveau
  • Autres utilisations des conteneurs de données ScriptableObject
  • Plus de ressources ScriptableObject

Remarque importante avant de commencer

Avant de plonger dans le projet de démonstration ScriptableObject et cette série de mini-guides, rappelez-vous qu'à leur cœur, les modèles de conception ne sont que des idées. Ils ne s'appliqueront pas à chaque situation. Ces techniques peuvent vous aider à apprendre de nouvelles façons de travailler avec Unity et les ScriptableObjects.

Chaque modèle a des avantages et des inconvénients. Choisissez uniquement ceux qui bénéficient de manière significative à votre projet spécifique. Vos concepteurs s'appuient-ils fortement sur l'éditeur Unity ? Un modèle basé sur ScriptableObject pourrait être un bon choix pour les aider à collaborer avec vos développeurs.

En fin de compte, la meilleure architecture de code est celle qui convient à votre projet et à votre équipe.

tab2

Conteneurs de données

Les développeurs de logiciels sont souvent préoccupés par la modularité - décomposer une application en unités plus petites et autonomes. Chaque module devient responsable d'un aspect spécifique de la fonctionnalité de l'application.

Dans Unity, les ScriptableObjects peuvent aider à la séparation des données de la logique.

Les ScriptableObjects excellent dans le stockage de données, surtout lorsqu'elles sont statiques. Cela les rend idéaux pour les statistiques de jeu, les valeurs de configuration pour les objets ou les PNJ, les dialogues de personnage, et bien plus encore.

Isoler les données de jeu de la logique de comportement peut rendre chaque partie indépendante du projet plus facile à tester et à maintenir. Cette "séparation des préoccupations" peut réduire les effets secondaires non intentionnels et indésirables lorsque vous apportez des modifications nécessaires.

Télécharger PaddleBallSO
tab3

Flux de travail général

Si vous souhaitez un rappel sur le flux de travail ScriptableObject, cet article Unity Learn peut vous aider. Sinon, voici une explication rapide :

Définir un ScriptableObject : Pour en créer un, définissez une classe C# qui hérite de la classe de base ScriptableObject avec des champs et des propriétés pour les données que vous souhaitez stocker. Les ScriptableObjects peuvent stocker les mêmes types de données disponibles pour les MonoBehaviours, ce qui en fait des conteneurs de données polyvalents. Ajoutez le CreateAssetMenuAttribute depuis l'éditeur pour faciliter la création de l'actif dans le projet.

Créer un actif : Une fois que vous avez défini une classe ScriptableObject, vous pouvez créer une instance de ce ScriptableObject dans le projet. Cela apparaît comme un actif enregistré sur le disque que vous pouvez réutiliser dans différents GameObjects et scènes.

Définir des valeurs : Après avoir créé l'actif, remplissez-le avec des données en définissant les valeurs de ses champs et propriétés dans l'Inspecteur.

Utiliser l'actif : Une fois que l'actif contient des données, référencez-le depuis une variable ou un champ. Toute modification apportée à l'actif ScriptableObject sera reflétée dans l'ensemble du projet.

Vous pouvez réutiliser les ScriptableObjects comme conteneurs de données dans différentes parties de votre jeu. Par exemple, vous pouvez définir les propriétés d'une arme ou d'un personnage dans un ScriptableObject, puis référencer cet actif depuis n'importe où dans le projet.

Remarque : Vous pouvez également générer des ScriptableObjects à l'exécution via la méthode CreateInstance. Pour le stockage de données, cependant, vous créerez généralement les actifs ScriptableObject à l'avance en utilisant le CreateAssetMenuAttribute.

tab4

ScriptableObjects contre MonoBehaviours

Pour mieux comprendre pourquoi les ScriptableObjects sont un choix plus adapté pour le stockage de données que les MonoBehaviours, comparez les versions vides de chacun. Assurez-vous de définir votre Asset Serialization sur Mode : Forcez le texte dans les paramètres du projet pour afficher le balisage YAML en tant que texte.

Créez un nouvel objet GameObject avec un MonoBehaviour autrement vide. Ensuite, comparez cela avec un actif ScriptableObject vide. En les plaçant côte à côte, ils devraient ressembler à la comparaison montrée dans l'image ci-dessus.

Les ScriptableObjects sont plus légers par rapport aux MonoBehaviours et n'ont pas la surcharge associée à ce dernier, comme le composant Transform. Cela donne aux ScriptableObjects une empreinte mémoire plus petite et les rend plus optimisés pour le stockage de données.

tab5

Démo de modèles

Les ScriptableObjects sont enregistrés en tant qu'actifs, donc ils persistent en dehors du mode Play, ce qui peut être utile. Par exemple, les données des ScriptableObjects sont disponibles de n'importe où, même si vous chargez une nouvelle scène.

L'exemple de démo Patterns présente un écran de crédits de base que vous pouvez tester vous-même. Modifiez le ScriptableObject Credits_Data puis appuyez sur Mettre à jour pour voir le texte enregistré apparaître.

Si vous aviez un RPG avec une quantité importante de dialogues ou une scène de tutoriel avec un script préenregistré, c'est une manière courante de stocker beaucoup de données.

Bien que les données dans le ScriptableObject se mettent à jour instantanément lorsqu'elles sont modifiées, notre projet nécessite un bouton Mettre à jour pour rafraîchir l'écran manuellement. L'écran basé sur l'UI Toolkit se construit une seule fois et doit être notifié lorsque les données ont été modifiées.

Créez un événement dans le ScriptableObject si vous souhaitez synchroniser les mises à jour automatiquement. Par exemple, ce script ExampleSO appellerait l'événement OnValueChanged chaque fois que ExampleValue change. Regardez l'exemple de code ci-dessous.

Ensuite, faites en sorte que votre objet UI d'écoute s'abonne à OnValueChanged et se mette à jour en conséquence.

Télécharger PaddleBallSO
tab6

Stockage des données de jeu avec le modèle flyweight

Les ScriptableObjects brillent lorsque de nombreux objets partagent les mêmes données. Par exemple, si vous construisiez un jeu de stratégie où de nombreuses unités ont la même vitesse d'attaque et la même santé maximale, il est inefficace de stocker ces valeurs individuellement sur chaque GameObject.

Au lieu de cela, vous pouvez consolider les données partagées à un endroit central et faire en sorte que chaque objet fasse référence à cet emplacement partagé. Dans la conception logicielle, c'est une optimisation connue sous le nom de modèle flyweight. Restructurer votre code de cette manière évite de copier de nombreuses valeurs et réduit votre empreinte mémoire.

Dans PaddleBallSO, le ScriptableObject GameDataSO agit comme un stockage de données partagées.

Plutôt que de garder une copie séparée des paramètres communs (vitesse, masse, rebond physique, etc.), les scripts Paddle et Ball font référence à la même instance de GameDataSO lorsque cela est possible. Chaque élément de jeu maintient des données uniques comme les positions et les événements d'entrée, mais utilise par défaut les données partagées lorsque cela est possible.

Bien que les économies de mémoire puissent ne pas être perceptibles avec seulement deux ou trois objets, modifier des données partagées est plus rapide et moins sujet aux erreurs que de modifier chaque objet manuellement.

Par exemple, si vous devez modifier la vitesse de la palette, l'ajuster à un seul endroit met à jour les deux palettes dans chaque scène. Si vous les stockiez en tant que champs uniques dans les MonoBehaviours, un clic incorrect pourrait facilement désynchroniser deux valeurs.

Décharger des données dans des ScriptableObjects peut également aider avec le contrôle de version et prévenir les conflits de fusion lorsque des coéquipiers travaillent sur la même scène ou Prefab.

tab7

Données de jeu PaddleBallSO

Le GameDataSO montre comment utiliser un ScriptableObject comme conteneur de données. Dans PaddleBallSO, cela inclut divers paramètres pour configurer le gameplay :

  • Données de la palette : Des attributs comme la vitesse de la palette, la traînée et la masse déterminent le mouvement et la physique des palettes pendant le gameplay.
  • Données de la balle : Cela contient la vitesse actuelle de la balle, la vitesse maximale et le multiplicateur de rebond, qui contrôle le comportement de la balle lorsqu'elle interagit avec une simulation.
  • Correspondance des données: GameDataSO contient des informations sur les délais entre les points pendant un match, aidant à contrôler le rythme du jeu.
  • Identifiants des joueurs: Les ScriptableObjects PlayerIDSO fonctionnent comme une identification d'équipe pour chaque joueur (par exemple, Joueur1 et Joueur2).
  • Sprites des joueurs: Ces sprites optionnels permettent la personnalisation de l'avatar du joueur.
  • Disposition du niveau: L'objet LevelLayoutSO définit les positions de départ pour les joueurs et les éléments de jeu comme les buts et les murs.

Avec ces paramètres et données tous dans un emplacement central, GameDataSO permet à n'importe quel objet d'accéder à ces données partagées. Cela simplifie la gestion de ces objets et favorise une plus grande cohérence dans votre projet. Changer la physique de la palette ? Faites un changement ici au lieu d'ajuster plusieurs scripts.

tab10

Exemple de double sérialisation : Mises en page de niveau

Parfois, vous pouvez avoir le beurre et l'argent du beurre. Avec la sérialisation duale, vous pouvez stocker des données dans un ScriptableObject tout en les maintenant simultanément dans un autre format.

Le script LevelLayoutSO démontre ce concept. En plus de contenir les positions de départ pour les palettes et la balle, il stocke les données de transformation pour les murs et les buts dans une structure personnalisée.

Ces valeurs peuvent être écrites sur disque via la méthode ExportToJson. Les fichiers JSON sont des textes lisibles par l'homme, permettant une modification simple en dehors de Unity. Cela vous permet de travailler avec des ScriptableObjects dans l'éditeur et ensuite de stocker leurs données dans un autre emplacement, comme un fichier JSON ou XML.

Les formats de fichiers comme JSON et XML peuvent être difficiles à utiliser dans l'éditeur, mais ils sont faciles à modifier en dehors de Unity dans un éditeur de texte. Cela ouvre la possibilité de niveaux personnalisés ou modifiés par les utilisateurs.

Le script GameSetup peut alors utiliser soit un ScriptableObject LevelLayout, soit un fichier JSON externe pour générer le niveau de jeu.

Pour charger un niveau modifié personnalisé, le script de configuration génère un ScriptableObject à l'exécution avec CreateInstance. Ensuite, il lit le texte du fichier JSON pour peupler le ScriptableObject.

Vos données personnalisées remplacent le contenu du ScriptableObject et vous permettent d'utiliser ce niveau modifié de manière externe comme n'importe quel autre. Le reste de l'application fonctionne normalement, sans être conscient du changement.

Télécharger PaddleBallSO
tab11

Autres utilisations des conteneurs de données ScriptableObject

Bien que notre mini-jeu de balle de paddle ne puisse pas démontrer tous les cas d'utilisation des conteneurs de données ScriptableObject, considérez ce qui suit pour vos propres applications :

  • Configuration du jeu : Pensez aux constantes, aux règles du jeu ou à tout autre paramètre de configuration qui n'a pas besoin de changer pendant le jeu. D'autres composants peuvent alors se référer à ces données de configuration sans utiliser de valeurs codées en dur.
  • Attributs des personnages et des ennemis : Utilisez des ScriptableObjects pour définir des attributs comme la santé, la puissance d'attaque, la vitesse, etc. Cela permet à vos concepteurs d'équilibrer et d'ajuster les éléments de gameplay sans un développeur.
  • Systèmes d'inventaire et d'objets : Les définitions et propriétés des objets comme les noms, descriptions et icônes sont parfaites pour les ScriptableObjects. Vous pouvez également les utiliser comme partie d'un système de gestion d'inventaire pour suivre les objets que le joueur collecte, utilise ou équipe.
  • Systèmes de dialogue et narratifs : Les ScriptableObjects peuvent stocker du texte de dialogue, des noms de personnages, des chemins de dialogue ramifiés et d'autres données liées à la narration. Ils peuvent poser les bases de systèmes de dialogue complexes.
  • Niveau et données de progression : Vous pouvez utiliser des ScriptableObjects pour définir les mises en page des niveaux, les points d'apparition des ennemis, les objectifs et d'autres informations liées aux niveaux.
  • Clips audio : Comme vu dans le projet PaddleBallSO, les ScriptableObjects peuvent stocker un ou plusieurs clips audio. Ceci peut définir des effets audio ou de la musique à travers plusieurs parties de votre jeu.
  • Clips d'animation : Les ScriptableObjects peuvent être utilisés pour stocker des clips d'animation, ce qui est utile pour définir des animations communes partagées entre plusieurs GameObjects ou personnages.

Au fur et à mesure que vous approfondissez votre compréhension des ScriptableObjects et les adaptez à vos propres projets, vous découvrirez encore plus d'applications pour eux. Ils sont particulièrement utiles pour gérer les données et facilitent le maintien de la cohérence entre divers éléments du jeu.

scriptable outro

Plus de ressources ScriptableObject

Lisez-en plus sur les modèles de conception avec les ScriptableObjects dans l'e-book Créer une architecture de jeu modulaire dans Unity avec des ScriptableObjects. Vous pouvez également en apprendre davantage sur les modèles de conception de développement Unity courants dans Améliorez votre code avec des modèles de programmation de jeux.