J'ai une certaine confusion avec les scènes dans Unity3d et je n'ai trouvé aucune ressource à leur sujet.
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:
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)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.
GameObject
, laissez l'objet survivre en utilisant DontDestroyOnLoad
.GameObject
spécifique, vous pouvez envisager de stocker un ScriptableObject à l'intérieur du AssetDatabase et de le référencer.Il y a 2 autres façons que je n'aime pas, mais juste pour les citer:
Ceci est un vaste sujet entre les deux, j'espère que cette réponse peut être un aperçu assez décent.
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