web-dev-qa-db-fra.com

unité se déplaçant vers une autre scène avec la scène actuelle en pause

Je fais un jeu de bataille au tour par tour dans Unity3D et j'ai 2 scènes (une scène de ville et une scène de bataille). À chaque fois que le personnage rencontre un monstre, le jeu passe à la scène de combat où le personnage se bat et retourne à la scène de la ville après avoir vaincu ou perdu.

Le problème est de savoir comment revenir à la scène de la ville avec le même état que lorsque le personnage est entré dans la scène de la bataille (position du personnage, états, etc.).

si j'utilise

Application.LoadLevel('battlescene');

puis

Application.loadLevel('townScene');

alors la ville commencera à partir de la première fois. Comment faire en sorte que le townscene continue d’où nous nous sommes arrêtés?

11
Jason

Je pense que vous pouvez y parvenir de deux manières. Tout dépend de votre plate-forme cible et de l'importance des ressources, mais nous y allons:

1) Si les ressources ne sont pas un problème

Vous pouvez mettre tous vos objets de scène de combat et de scène normaux dans une scène.

  • Créez deux objets de jeu vides (un pour les objets de scène de ville et l'autre pour les objets de scène de bataille). Vous pouvez alors avoir deux versions De votre ou vos personnages de jeu ou une version. Ensuite, écrivez un script qui Bascule simplement les caméras de la scène de la ville sur la scène de la bataille lorsque Une bataille est déclenchée et revient à la scène de la ville lorsque la bataille est plus de.

  • Si vous avez une version de chaque personnage, vous pouvez simplement ajouter un script qui modifie le comportement de votre contrôleur de personnage de jeu. En/à partir des modes bataille et normal/ville.

  • Si vous avez deux versions de chaque personnage, il vous suffira d'écrire les scripts de contrôleur de personnage appropriés et d'activer/désactiver les personnages du jeu en fonction de celui que vous utiliserez. C'est ainsi que des jeux comme Final Fantasy 7,8,9 ont le même effet . Il y avait deux versions des personnages du jeu: une pour le mode bataille et l'autre pour le mode normal.

2) Si les ressources SONT un problème (Et je pense un moyen plus efficace)

Vous pouvez utiliser la fonction Application.LoadLevelAdditive . Cette fonction vous permet de charger une scène différente et de ne pas tout détruire dans la scène actuelle. Elle prend la nouvelle scène et tous ses objets et les ajoute à la scène actuelle. Vous pouvez donc l'utiliser comme ceci: :

  • Créez une scène de combat séparée et, au sein de votre scène, créez un objet de jeu vide pour contenir chaque objet de votre scène.

  • Dans ta scène noraml, fais de même.

  • Lorsque vous devez passer en mode bataille, utilisez:

    Application.LoadLevelAdditive ('battlescene');

  • Et quand/si vous voulez décharger votre scène de combat après cela, vous pouvez le faire simplement en écrivant du code permettant de détruire l’objet de jeu bataille Car il contient tout ce qui se trouve sur votre scène de combat.

Comme avec la première méthode, vous pouvez décider si vous voulez avoir deux versions différentes de vos personnages ou non. L’un des avantages des deux versions est que, si vous voulez gagner du temps en évitant d’entrer dans les détails des modèles de jeu (en particulier si votre jeu est vraiment gros), vous pouvez économiser de la puissance de traitement en utilisant des modèles réduits pour la scène En utilisant des modèles raffinés et plus détaillés pour la scène de combat, supposez que votre scène de bataille est une petite scène représentant l’endroit où vos personnages se battent. Pense que le fantasme final VII. Juste quelque chose à considérer.

J'espère que ça aide. J'ai tout écrit à la hâte, mais je ne sais pas si quelque chose doit être éclairci.

15
amasiye

Vous pouvez le faire par script en c #

void onYourFunction()
{
    Time.timeScale = 0; //pauses the current scene 
    Application.LoadLevelAdditive("YourNextScene"); //loads your desired other scene
}

Et lorsque vous souhaitez réactiver votre jeu, vous pouvez utiliser Time.timeScale = 1; 

4
Shah Abdullah

Je sais que ceci est un ancien post, mais il existe une méthode supplémentaire qui peut être utilisée. Ce serait pour sauver l'état de la scène. Cela s'avère pratique lorsque vous ne vous attendez pas à ce que les utilisateurs disposent des ressources nécessaires pour charger 2 scènes avec Application.LoadLevelAdditive. Cette méthode peut potentiellement utiliser deux fois plus de ressources.

Lorsque vous enregistrez l'état (enregistrez toutes les informations pouvant être modifiées dans un fichier ou une base de données), vous pouvez alors charger le niveau ultérieurement et ne pas le laisser en mémoire. Vous pouvez également l'utiliser pour enregistrer votre partie. 

1
Casey Estes