• 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

Utilisez des énumérations basées sur ScriptableObject dans votre projet Unity

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 des énumérations basées sur ScriptableObject dans votre projet Unity.

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

La démo s'inspire des 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, le livre électronique, 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 :

  • Commencez avec la démo ScriptableObjects Unity
  • Séparer les données de jeu et la logique avec ScriptableObjects
  • Utilisez des ScriptableObjects comme objets délégués
  • Utilisez des ScriptableObjects comme canaux d'événements dans le code du jeu
  • Comment utiliser un ensemble d'exécution basé sur ScriptableObject
  • Remarque importante avant de commencer
  • Énumérations extensibles
  • Énumérations basées sur ScriptableObject
  • ID du joueur dans PaddleBallSO
  • Démo des modèles
  • Comportement extensible
  • Avantages des énumérations basées sur 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 ses avantages et ses 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.

onglet 1
SUPPRIMER OU RÉORGANISER DES VALEURS ENUM PEUT ENTRAÎNER UN COMPORTEMENT INATTENDU.

Énumérations extensibles

Les énumérations sont un moyen pratique de gérer un ensemble fixe de valeurs nommées dans votre code. Cependant, elles comportent certaines limitations. Puisque les valeurs d'énumération sérialisées sont stockées sous forme d'entiers plutôt que sous leurs noms symboliques, supprimer ou réorganiser une valeur peut entraîner un comportement incorrect ou inattendu. Cela signifie que les énumérations, surtout lorsque vous en avez beaucoup, peuvent créer des maux de tête dans le développement Unity.

La méthode standard

Voici à quoi ressemble une énumération typique :

[System.Serializable]
public enum HandGestures
{
Pierre,
Article,
Ciseaux
}

Vous pouvez sérialiser un énum avec l'attribut System.Serializable et il apparaît dans l'Inspecteur.

Le problème

Réorganiser ou supprimer une valeur peut causer des problèmes. Parce que chaque valeur est en interne un entier, ce qu'elle représente peut devenir quelque chose de différent. Dans l'exemple donné, supprimer la valeur Papier ferait que Ciseaux assume la valeur de 1.

Ou, si nous ajoutions une valeur comme dans l'exemple ci-dessous.

La valeur d'énum sélectionnée changerait si elle vient après l'entrée supprimée.

Cela peut causer des problèmes lors de la maintenance et de la mise à jour des projets, en particulier lorsque votre énum contient de nombreuses valeurs. Vous pouvez atténuer ce problème en laissant un élément vide ou inutilisé, ou en définissant explicitement des valeurs entières. Cependant, aucune des solutions n'est idéale.

Télécharger PaddleBallSO
tab3
VÉRIFICATION DE L'ÉGALITÉ ENTRE SCRIPTABLEOBJECTS

Énumérations basées sur ScriptableObject

Les énumérations basées sur ScriptableObject vous donnent la fonctionnalité des énumérations traditionnelles mais sont stockées en tant qu'actifs individuels. Par exemple, regardez le ScriptableObject PlayerIDSO dans le projet PaddleBallSO dans l'exemple ci-dessous.

Essentiellement, c'est un ScriptableObject vide.

Vous pouvez l'utiliser pour créer un certain nombre d'actifs ScriptableObject dans le projet, comme P1, P2, etc. Même lorsqu'ils ne contiennent aucune donnée, vous pouvez utiliser les ScriptableObjects pour la comparaison. Il suffit de créer un nouvel actif ScriptableObject dans le projet et de lui donner un nom.

Vous pouvez créer autant d'ID de joueur que vous en avez besoin dans le projet et facilement passer de l'un à l'autre. Il suffit de changer l'actif assigné dans le script GameDataSO.

Si vous vérifiez l'égalité, cela fonctionne de manière similaire à un enum. Deux variables font-elles référence au même ScriptableObject ? Si oui, ce sont le même type d'élément. Sinon, ce ne sont pas.

Même sans données supplémentaires, le ScriptableObject représente une catégorie ou un type d'élément.

ID du joueur dans PaddleBallSO

Dans PaddleBallSO, le PlayerIDSO devient une désignation d'équipe. Nous utilisons les actifs P1 et P2 dans le GameDataSO pour différencier les deux palettes.

Le script GameSetup attribue à chaque palette un ID de joueur. Pendant le jeu, les scripts Paddle comparent l'entrée du joueur avec l'ID d'équipe désigné.

Cela a des applications pour tout type de jeu multijoueur. Alternativement, envisagez de les adopter partout où vous utilisez un enum.

Puisqu'ils sont simplement des attributions dans l'Inspector, les ScriptableObjects ne sont pas soumis aux mêmes problèmes de renommage et de réorganisation.

Vous voulez changer les noms d'identifiant en « Joueur1 » ou « Joueur2 », respectivement ? Vous pouvez le faire, et tout continue à fonctionner. Ajouter plus de ScriptableObjects ? Pas de problème – l'attribution d'actifs dans l'Inspector reste la même.

tab5
LES BLOCS UTILISENT DES ÉQUIPES ASSIGNÉES POUR LES COMPARAISONS.

Démo des modèles

Ce comportement est utile pour créer du gameplay. Dans la démo Patterns, cliquez sur le bouton Switch Enum pour changer d'équipe. Un MonoBehaviour sur le DemoBall met à jour le SpriteRenderer en conséquence.

La balle inflige-t-elle des dégâts à un Bloc lorsqu'elle entre en collision ? Découvrez-le en effectuant un test rapide d'égalité. Voici une façon de les comparer dans l'exemple de code ci-dessous.

Cette méthode peut déterminer si deux GameObjects sont dans la même équipe, ce qui est utile lors de la vérification des interactions amicales ou ennemies. Cette simple comparaison peut s'appliquer aux ramassages d'objets, aux dégâts ou à tout autre élément ayant une "équipe" ou un "alignement".

Télécharger PaddleBallSO

Comportement extensible

La partie amusante se produit lorsque vous ajoutez de la logique à vos ScriptableObjects. Contrairement à un enum conventionnel, un ScriptableObject peut avoir des champs et des méthodes, en plus de contenir des données.

Utilisez-les pour que chaque ScriptableObject puisse avoir une logique de comparaison spécialisée. Par exemple, vous pourriez avoir un ScriptableObject qui définit des effets de dégâts spéciaux (par exemple, froid, chaleur, électrique, magique, etc.).

Si votre application nécessite un système d'inventaire pour équiper des objets de gameplay, les ScriptableObjects peuvent représenter des types d'objets ou des emplacements d'armes. Certains personnages ne sont-ils pas autorisés à tenir certains objets ? Certains objets sont-ils magiques ou ont-ils des capacités spéciales ? Les enums basés sur ScriptableObject peuvent ajouter des méthodes pour vérifier cela.

Le MonoBehaviour DemoBall dans l'exemple précédent inclut la méthode AreEqual pour comparer les ScriptableObjects. Lors de l'extension du comportement, vous pouvez regrouper la logique de comparaison à l'intérieur du ScriptableObject lui-même.

Dans la démo Patterns, vous pourriez modifier la balle pour qu'elle soit plus sélective lors de la collision avec un objet. Regardez un objet polyvalent pour la collision dans l'exemple de code ci-dessous.

Cela pourrait atteindre des résultats similaires à la démo actuelle, mais il a maintenant un champ de m_Weakness. Cela permet à chaque ScriptableObject de définir un autre ScriptableObject à détruire lors d'une collision.

Plutôt que d'appeler la méthode AreEqual, chaque ScriptableObject gère simplement sa propre logique de comparaison.

Le résultat est plus flexible et extensible. Au lieu de faire détruire la balle à un bloc d'une équipe différente, vous pouvez être spécifique. Plusieurs balles dans la scène pourraient détruire différents blocs, en fonction de leurs CollisionItems individuels.

Cela prépare le terrain pour des interactions différentes et plus complexes. Si vous vouliez créer un système de pierre-papier-ciseaux, vous pourriez définir trois ScriptableObjects : Pierre, Papier et Ciseaux. Chacun pourrait avoir sa propre m_Weakness unique et utiliser la méthode IsWinner pour gérer les interactions.

Contrairement aux enums, les ScriptableObjects rendent ce processus modulaire et adaptable. Il n'est pas nécessaire de s'appuyer sur des structures de données supplémentaires ou d'ajouter une logique supplémentaire pour synchroniser avec un ensemble de données séparé. Ajoutez simplement un champ et/ou une méthode supplémentaires pour gérer la logique.

Avantages des énumérations basées sur ScriptableObject

Une fois que vous êtes familiarisé avec les enums basés sur ScriptableObject, vous constaterez qu'ils peuvent améliorer votre flux de travail, surtout lorsque vous travaillez avec des coéquipiers. Comme ce sont des actifs, les mettre à jour crée moins de conflits de fusion, réduisant le risque de perte de données.

Ajouter de nouveaux enums basés sur ScriptableObject est comme créer un autre actif. Contrairement aux enums traditionnels, ajouter de nouvelles valeurs ne cassera pas votre code existant. De plus, Unity dispose déjà d'outils intégrés pour rechercher, filtrer et organiser, tout comme n'importe quel autre actif.

En bonus, utiliser l'interface utilisateur de glisser-déposer de l'éditeur permet à vos concepteurs d'étendre les données de gameplay sans soutien supplémentaire d'un développeur logiciel. Vous devrez toujours coordonner comment configurer les champs au départ, mais les concepteurs peuvent ensuite remplir ces champs avec des données par eux-mêmes.

Télécharger PaddleBallSO
outro scriptable

Plus de ressources ScriptableObject

Les énumérations basées sur ScriptableObject sont une ressource supplémentaire que votre équipe peut utiliser pour améliorer la collaboration et l'efficacité.

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