Le billet de blog suivant, sauf indication contraire, a été écrit par un membre de la communauté Gamasutras.
Les pensées et les opinions exprimées sont celles de l’auteur et non de Gamasutra ou de sa société mère.
Objectif
L’objectif principal de ce billet de blog est de vous donner une idée de ScriptableObject dans Unity.
Qu’est-ce qu’un ScriptableObject ?
Quelle est la différence entre ScriptableObject et la classe Monobehaviour ?
Quels sont les avantages et les inconvénients de Scriptableobject ?
Comment utiliser ScriptableObject ?
Répondons à toutes les questions en faisant un tour de ce blog sur ScriptableObject
Selon la documentation de l’API Unity,
« ScriptableObject est une classe dont vous pouvez dériver si vous voulez créer des objets qui n’ont pas besoin d’être attachés aux objets du jeu. »
Confusé…?
Ne vous inquiétez pas, si vous n’avez pas compris. Ici, je vais vous expliquer ce que cela signifie.
Comme nous le savons, avec Unity, tout est un objet.
Les monobébés sont un des objets.
Les objets de jeu : Dans votre scène, vous pouvez vous déplacer avec transformer.
Un ScriptableObject est une sorte d’Objet mais, il ne peut contenir que des données.
Donc, ils ne sont pas impliqués dans le jeu réel.
J’espère que vous avez compris la définition de ScriptableObject.
Discutons des avantages et des inconvénients de ScriptableObject.
Prose de ScriptableObject:
- Intégré dans Unity
- Ils sont très bien maintenus par Unity.
- Vous pouvez interagir avec eux très facilement dans l’inspecteur de Unity.
- Ils peuvent être sauvegardés comme Assets
- Vous pouvez les créer comme un mini-fichier à l’intérieur de votre projet.
- Vous pouvez le mettre à jour et le sauvegarder selon les exigences de votre jeu.
- Peut être sauvegardé pendant l’exécution
- Si vous changez quelque chose pendant l’exécution, il s’en souviendra réellement.
- Solution interne
- Lorsque vous essayez d’obtenir les données pendant le temps d’exécution du jeu, vous ne vous inquiétez pas de l’analyse des fichiers externes qui entreront plus en jeu.
- Grandes quantités de données
- Vous pouvez enregistrer des millions d’entiers à l’intérieur d’un ScriptableObject.
- Donc, il y a beaucoup d’espace(pas de fonction de limite de taille).
- Ajouter à la structure au fur et à mesure
- Alors que vous construisez un objet scriptable et créez quelques instances de celui-ci et réalisez ,ohh j’ai besoin d’un nouveau paramètre pour ‘moveSpeed’ ou n’importe quelle variable supplémentaire dont vous avez besoin, vous pouvez ajouter, cela ne perturbera pas votre variable.
- Supprimer une variable peut avoir un impact un peu négatif.
Les inconvénients de ScriptableObject:
- Nécessite un éditeur de script
- Si vous voulez faire des actifs à partir de script, alors vous devez en connaître un peu le fonctionnement.
- Ne peut pas éditer en dehors de Unity
- Si vous travaillez strictement avec Unity, ce n’est pas vraiment un énorme problème.
- Mais si vous avez comme une solution de base d’équipe, où vous voulez envoyer des fichiers à quelqu’un et les faire éditer, alors cela ne fonctionnera pas.
- Ne peut pas sauvegarder une fois déployé
- Ne peut pas sauvegarder pendant l’exécution, une fois que vous avez construit le jeu, ce qui signifie que ce n’est pas une solution pour sauvegarder les données d’un joueur.C’est seulement pour sauvegarder les données de développement du jeu.
Prenons un exemple pour comprendre comment utiliser ScriptableObject dans le jeu.
Donnons d’abord une tâche.
Supposons, nous avons un jeu à 10 niveaux et à chaque niveau le comportement de l’ennemi changera.
Avez-vous des idées, comment allez-vous faire cela ??
Ahh, Vous pourriez penser que faire 10 préfabriqués de 10 ennemis différents et les attribuer à chaque niveau. N’est-ce pas ??
Etes-vous sûr, c’est vraiment une bonne pratique ?
En fait, la réponse est Non.
« Parce qu’un objet ennemi peut avoir 4 variables et la fonction Update() avec lui, et supposons qu’il utilise 4 Mb de mémoire, donc 10 niveaux d’ennemis peuvent nécessiter 40 Mb de quantité de mémoire. »
Donc, voici la solution. Utilisez ScriptableObject pour stocker les données de l’objet ennemi.
Développons, notre mini jeu avec ScriptableObject.
D’abord, je vais créer un script simple sans utiliser un ScriptableObject. (Conformément à notre première idée de créer un préfabriqué différent de chaque ennemi différent et de l’affecter à chaque niveau 😉 )
Etape 1
- Créer un GameObject vide nommé Enemy.
Etape 2
- Créer un script C# et le nommer EnemyMove
Ecrire le code suivant dans EnemyMove.cs
public class EnemyMove : MonoBehaviour {#region PUBLIC_VARIABLESpublic string name;public int moveSpeed;public Color color;public string colorName; public SpriteRenderer spriterendere;#endregion#region PRIVATE_VARIABLESprivate float speed;Vector3 newPosition;#endregion#region UNITY_CALLBACKSvoid Update () {ChangeSpeed();gameObject.name = name;spriterendere.color = color;newPosition=transform.position;newPosition.y = Mathf.Sin (Time.time) * speed;transform.position = newPosition;}#endregion#region PROVATE_METHODSprivate void ChangeSpeed(){speed = Mathf.MoveTowards (speed,moveSpeed,Time.deltaTime);}#endregion}
Etape 3
- Assignez-le à un GameObject(Enemy) vide.
- Le script EnemyMove a trois variables publiques.
- Si le jeu a tant d’ennemis GameObject avec le script enemyMove avec lui alors utilise beaucoup de mémoire.
- Pour cela selon notre solution ScriptableObject, nous pouvons faire un script EnemyData Au lieu de stocker ces variables dans le script EnemyMove.
Etape 4
- Créer un script C# nommé EnemyData.
- qui hérite de ScriptableObject au lieu de Monobehaviour.
Ecrire le code suivant dans EnemyData.cs.
public class EnemyData : ScriptableObject {#region PUBLIC_VERIABLEpublic string name;public int moveSpeed;public Color color;public string colorName; #endregion}
Etape 5
- Changer le code à l’intérieur de ‘EnemyMove’, qui a été créé précédemment.
- Créer une variable publique ‘data’ qui est la référence de ‘EnemyData’.
- Remplacer la publique qui est déjà dans ‘EnemyData’
Changer selon le code suivant.
public class EnemyMove : MonoBehaviour {#region PUBLIC_VARIABLESpublic EnemyData data;public SpriteRenderer spriterendere;#endregion#region PRIVATE_VARIABLESprivate float speed;Vector3 newPosition;#endregion#region UNITY_CALLBACKSvoid Update () {ChangeSpeed();gameObject.name = name;spriterendere.color = data.color;newPosition=transform.position;newPosition.y = Mathf.Sin (Time.time) * speed;transform.position = newPosition;}#endregion#region PROVATE_METHODSprivate void ChangeSpeed(){speed=Mathf.MoveTowards (speed,data.moveSpeed,Time.deltaTime);}#endregion}
Maintenant vous pouvez voir qu’à l’intérieur de l’inspecteur pour Enemy GameObject sur ‘Data’ variable apparaîtra,
Any idea..what you suppose assign over here ??
Suivez-moi…
Etape 1
- Ajoutez une ligne dans EnemyData.cs comme suit
public class EnemyData : ScriptableObject {#region PUBLIC_VERIABLEpublic string name;public int moveSpeed;public Color color;public string colorName; #endregion}
Etape 2
- Créer un dossier Game data et faire ce qui suit
Etape 3
- Nommez-le comme vous le souhaitez.
- Maintenant, vous pouvez voir toutes les variables à l’intérieur de l’EnemyData dans la fenêtre de l’inspecteur, vous pouvez changer les valeurs des variables ici.
Etape 4
- Assignez ceci dans le script ‘EnemyMove’
Je suis sûr que vous avez toutes les réponses maintenant.
Conclusion
- LesScriptableObjects sont vraiment bons pour le fait qu’ils peuvent briser vos données en morceaux plus importants.
- Pour que vous ne mangiez pas beaucoup de mémoire.
- LesScriptableObjects sont seulement pour le développement.