L'unité singleton gestionnaire de classes
Dans l'Unité, ce qui est une bonne façon de créer un singleton gestionnaire de jeu qui peut être consulté partout dans le monde de la classe avec des variables statiques qui va cracher les mêmes valeurs constantes pour chaque classe qui tire ces valeurs? Et quelle serait la façon de la mettre en œuvre dans l'Unité? Dois-je joindre à un GameObject? Peut-il être juste là dans un dossier sans être dans la scène visuellement?
- Voir le wiki à propos de Singleton
- Il convient de noter quelque part que les variables statiques et les singletons, par nature, survivre à des transitions entre les scènes et doit donc être traité avec soin à cet égard
- Vous ne pouvez pas utiliser les singletons dans l'Unité. Il est un des moteurs de jeu et les soi-disant "ECS" des systèmes (en.wikipedia.org/wiki/Entity_component_system).
MonoBehaviors
ont pas de sens, sauf si elles sont unComponent
"attaché" à uneGameObject
. le Tout dans un moteur de jeu de scène est un "singleton", un objet instancié. Il n'y a qu'un "lara croft" dans le jeu de scène. Si vous avez besoin d'un MonoBehavior qui existe à partir d'une scène à l'autre, il suffit de le rendre persistant avec desDontDestroyOnLoad
, à partir de votre précontrainte de la scène. - Il est littéralement à cette simple ... stackoverflow.com/questions/37276811/... C'est une ligne de code
SoundEffects soundEffects = Object.FindObjectOfType<SoundEffects>();
C'est juste un non-problème. - Cette unitygeek.com/unity_c_singleton blog de l'expliquer très bien sur singleton gestionnaire de classes
Vous devez vous connecter pour publier un commentaire.
Comme toujours: ça dépend. J'utilise les singletons de deux sortes, les composants reliés à
GameObject
et autonome classes ne proviennent pas de l'MonoBehaviour
. IMO l'ensemble de la question est de savoir comment les instances liées à la lifcycle des scènes, des objets de jeu, ... Et ne pas oublier parfois, il est plus pratique de disposer d'un composant en particulier référence à d'autresMonoBehaviour
objets est plus facile et plus sûr.Start
est appelé ou qui ont à effectuer des actions dansUpdate
ou d'autres méthodes. Puis-je les mettre en œuvre, de composants et de les attacher à un objet de jeu qui survit chargement de nouvelles scènes.J'ai conçu à base de composants singletons (type 2) avec deux parties: une persistante
GameObject
appeléMain
, qui détient tous les composants et d'une télévision singleton (type 1) appeléMainComponentManager
pour la gérer. Certains le code de démonstration:Maintenant d'autres célibataires qui veulent s'inscrire comme
Main
composant simplement ressembler à:MonoBehavior
, c'est vide de sens.Ingénieurs qui sont nouveaux à l'Unité, souvent, ne sont pas d'avis que
vous ne pouvez pas avoir un "singleton" dans un système ECS.
Il est dénuée de sens.
Tout ce que vous avez dans l'Unité est GameObjects, à, XYZ positions. Ils peuvent avoir des composants attachés.
Ce serait comme essayer d'avoir un "singleton" ou "héritage" dans les .... Photoshop ou Microsoft Word.
Photoshop fichier - pixels à XY positions
Éditeur de texte fichier - lettres à des positions X
L'unité fichier - GameObjects à XYZ positions
Il est "juste, que de simples".
Vous absolument avoir une précontrainte de la scène, de toute façon, bien sûr, dans chaque Unité de projet.
Incroyablement simple comment: https://stackoverflow.com/a/35891919/294884
C'est tellement simple, c'est un non-problème.
La fois l'Unité comprend un "built-dans la précharge de la scène" (c'est à dire, pour vous épargner un clic dans la création d'un) ce qui, finalement, ne jamais être à nouveau discutée.
(Note A - certains des langues que vous utilisez pour compiler les Composants de l'Unité de cours ont des concepts OO; l'Unité elle-même n'a pas de connexion du tout OO.)
(Note B - dans les premiers jours de l'Unité, vous verriez les tentatives de rendre le code qui "crée un objet de jeu à la volée et retient l'unique - et s'attache à elle". En plus d'être bizarre, juste FWIW, il est théoriquement pas possible de garantir l'unicité (en fait même pas dans un cadre (frame). Encore une fois, c'est juste complètement discutable parce que c'est un banal non-problème, dans l'Unité comportements généraux il suffit d'aller sur la précharge sur la scène.)
Si cette classe est juste pour l'accès à des variables globales, alors vous n'avez pas vraiment besoin d'un pattern singleton pour cela, ou utiliser un GameObject.
Il suffit de créer une classe public static membres.
Les autres solutions sont très bien mais trop si vous avez besoin d'un accès global à des variables.
J'ai écrit une classe singleton qui rend facile de créer des objets singleton. Son est un MonoBehaviour script, de sorte que vous pouvez utiliser les Coroutines. Il est basé sur ce L'unité l'article Wiki, et je vais ajouter une option créer à partir de la Préfabrication plus tard.
De sorte que vous n'avez pas besoin d'écrire le Singleton codes. Il suffit de télécharger ce Singleton.cs de la Classe de Base, l'ajouter à votre projet, et de créer votre singleton extension:
Maintenant votre MySingleton classe est un singleton, et vous pouvez l'appeler par Exemple:
Voici un tutoriel complet: http://www.bivis.com.br/2016/05/04/unity-reusable-singleton-tutorial/
C'est la configuration que j'ai créé.
D'abord créer ce script:
MonoBehaviourUtility.cs
Ensuite dans n'importe quelle classe vous voulez être un singleton ce faire:
Au lieu de créer un singleton pour chaque classe. Je vous suggère de créer une classe générique pour singleton. j'utilise de suivre cette méthode, qui font de ma vie très facile.
Pour Plus de détails, visitez ici
Ou
Créer l'Unité de classe C# dans l'unité et utilisez le code suivant
Ici est un simple code à partir de l'Unité Tutoriel. pour une meilleure compréhension ouvrir le lien
Une façon de le faire est de faire une scène juste pour initialiser votre gestionnaire de jeu comme ceci:
C'est ça, c'est tout ce que vous devez faire. Et puis tout de suite après l'initialisation du gestionnaire de jeu, chargez le côté de la scène et de ne jamais revenir à cette scène à nouveau.
Ont un oeil à ce tutoriel:
https://youtu.be/64uOVmQ5R1k?list=WL
Edit:
Changé
GameManager static instance;
àstatic GameManager instance;