web-dev-qa-db-fra.com

Comprendre les scènes dans Unity3d

J'ai une certaine confusion avec les scènes dans Unity3d et je n'ai trouvé aucune ressource à leur sujet.

  1. Quand faut-il utiliser les scènes? Par exemple, dans un jeu de plateforme, chaque niveau devrait-il être une scène différente? Le menu principal serait-il une scène?
  2. Peut-on superposer des scènes?
  3. Comment les ressources fonctionnent-elles entre les scènes? Sont-ils attachés à chaque scène individuelle et doivent être rechargés à chaque fois. Peut-on spécifier quand un actif n'est plus nécessaire?
  4. Comment envoyer des données entre scènes/interface entre scènes? Je comprends que c'est un sujet large, mais je ne voulais pas envoyer de spam avec plusieurs questions.
40
user2853108

Quand faut-il utiliser les scènes? Par exemple, dans un jeu de plateforme, chaque niveau devrait-il être une scène différente? Le menu principal serait-il une scène?

Il n'y a pas de règles générales à ce sujet. En théorie, vous ne pouvez avoir qu'une seule scène pour l'ensemble du jeu. La façon dont vous organisez vos scènes dépend entièrement de vous et dépend souvent du type de jeu que vous créez.

Je pense qu'il y a au moins 3 fonctionnalités à considérer pour utiliser des scènes:

  • ils sont un conteneur logique pour tous les objets pré-instanciés qui pourraient être utiles pour diviser votre jeu en plusieurs niveaux/sections.
  • Vous pouvez sérialiser des références croisées entre GameObjects et Components à l'intérieur d'une scène (si GO A a besoin d'une référence à GO B , et ils appartiennent à la même scène, la référence peut être sérialisée et vous n'avez plus besoin de trouver l'objet référencé au moment de l'exécution)
  • Lorsque vous chargez (pas de manière additive) une autre scène, les ressources déjà chargées en mémoire sont automatiquement libérées

Peut-on superposer des scènes?

Oui, vous pouvez utiliser LoadAdditive . Malheureusement, une fois que 2 scènes sont toutes deux chargées en mémoire, il n'y a pas de moyen automatique de distinguer les objets appartenant à l'une ou à l'autre. Donc, si vous chargez additif un environnement de second niveau, c'est à vous de garder la trace de l'environnement précédent et de le détruire explicitement si vous en avez besoin.

Comment les ressources fonctionnent-elles entre les scènes? Sont-ils attachés à chaque scène individuelle et doivent être rechargés à chaque fois. Peut-on spécifier quand un actif n'est plus nécessaire?

Par défaut, tous les GameObject d'une scène seront détruits une fois la nouvelle scène chargée (sauf si vous utilisez un chargement de scène additif). Un moyen de faire survivre un GameObject à travers des scènes est de le marquer en utilisant DontDestroyOnLoad .

Si vous devez partager une "configuration" particulière d'un GameObject, vous pouvez le stocker en tant que préfabriqué et le référencer sur des scènes (mais n'oubliez pas qu'une fois dans une scène, il s'agit d'une instance préfabriquée, donc le GO partage avec le prefab les propriétés sérialisées initiales et non remplacées, mais 2 instances du même préfabriqué sont des objets différents).

Comment envoyer des données entre scènes/interface entre scènes?

Plusieurs façons, selon le type de données persistantes que vous souhaitez partager.

  • Pour une instance particulière de GameObject, laissez l'objet survivre en utilisant DontDestroyOnLoad.
  • Si vous avez des données de configuration qui n'ont pas besoin d'être attachées à un GameObject spécifique, vous pouvez envisager de stocker un ScriptableObject à l'intérieur du AssetDatabase et de le référencer.
  • Si vous avez des données qui doivent persister sur différentes sessions de jeu, vous pouvez envisager de les stocker dans PlayerPrefs .

Il y a 2 autres façons que je n'aime pas, mais juste pour les citer:

  • L'utilisation d'un champ statique peut parfois vous aider à le faire, mais cela pose plusieurs problèmes de mon point de vue
  • Enregistrer et charger à partir du disque (peut être utile dans plusieurs situations, mais souvent, cela dépend de la plate-forme et vous pouvez avoir des problèmes, en particulier sur différentes plates-formes mobiles)

Ceci est un vaste sujet entre les deux, j'espère que cette réponse peut être un aperçu assez décent.

58
Heisenbug

Quand faut-il utiliser les scènes? Par exemple, dans un jeu de plateforme, chaque niveau devrait-il être une scène différente? Le menu principal serait-il une scène?

Il n'y a aucune règle quant au nombre de scènes que vous devez avoir dans votre jeu. Cependant, les scènes vous permettent de séparer logiquement des parties de votre jeu du reste. Vous devez avoir au moins une scène.

Par menu principal, si vous faites référence à un canevas avec vos éléments d'interface utilisateur, il sera DANS une scène et non une scène elle-même. Canvas est juste un autre GameObject, que nous utilisons principalement pour afficher les menus du jeu. Je crée principalement un Canvas GameObject, je mets un script du nom de "UIManager" et je mets DontDestroyOnLoad dessus, donc j'y ai accès dans toutes les scènes. Faites-le Singleton et je m'assure qu'il n'est pas dupliqué.

Peut-on superposer des scènes?

Oui, il n'y a aucune restriction quant au nombre de scènes que vous pouvez charger à la fois. Dans quel but prévoyez-vous de superposer des scènes? Peut-être y a-t-il un meilleur moyen que le chargement additif.

Comment les ressources fonctionnent-elles entre les scènes? Sont-ils attachés à chaque scène individuelle et doivent être rechargés à chaque fois. Peut-on spécifier quand un actif n'est plus nécessaire?

Les actifs sont ce que vous voyez dans votre hiérarchie de "projet". Je pense que vous vouliez dire "GameObject" dans la scène, et si oui, pensez à vos objets de jeu comme des entités avec des composants ( Entity-Component System ). Toutes les entités d'une scène sont détruites lorsque sa scène parente est détruite jusqu'à ce qu'il soit explicitement indiqué de ne pas le faire, en utilisant DontDestroyOnLoad dans un composant (un comportement unique en cas d'unité). Ceux détruits seront récupérés.

La façon dont ils sont chargés (ou rechargés) dépend donc de votre implémentation, selon que vous les instanciez/les détruisez une fois de plus ou si vous placez leurs préfabriqués instanciés dans un objet mis en cache et que vous les récupérez plus tard.

Comment envoyer des données entre scènes/interface entre scènes?

Heisen a couvert ceux auxquels je pouvais penser. Juste pour ajouter un peu, cela dépend aussi de la façon dont vous voulez que l'architecte de votre projet. Donc, si vous aviez une structure de données sous-jacente, par exemple hold Commandes , vous êtes libre de l'utiliser dans n'importe quelle partie de votre projet

2
Farhan