2012-11-21 11 views
11

Sto realizzando un gioco di battaglia a turni in Unity3D e ho 2 scene (una scena cittadina e una scena di battaglia). Ogni volta che il personaggio incontra un mostro, il gioco salta alla scena della battaglia in cui il personaggio combatte e torna alla scena della città dopo aver sconfitto o perso.unità che si sposta su un'altra scena con scena corrente in pausa

Il problema è come tornare alla scena città con lo stesso stato di quando il personaggio entra in scena di battaglia (posizione del carattere, stati, etc.)

se uso

Application.LoadLevel('battlescene'); 
poi

Application.loadLevel('townScene'); 

quindi il cityscene inizierà dalla prima volta. Come rendere la cityscene da dove eravamo rimasti?

risposta

15

Ci sono due modi in cui penso che sia possibile farlo. Tutto dipende dalla vostra piattaforma di destinazione e quanto sia importante le risorse sono, ma qui andiamo:

1) Se le risorse non sono un problema

si potrebbe mettere tutti la scena e scena di battaglia normali oggetti in una scena .

  • Creare due oggetti vuoti di gioco (una per gli oggetti di scena Town e l'altro per la scena di battaglia Objects). È quindi possibile avere due versioni dei personaggi del gioco o uno. Quindi scrivi uno script che semplicemente cambia la (e) camera (i) dalla scena della città sulla scena della battaglia quando una battaglia viene attivata e torna alla scena della città quando la battaglia è oltre.

  • Se si dispone di una versione di ciascun personaggio, è sufficiente aggiungere uno script che modifichi il comportamento del controller di gioco del gioco da/in modalità battaglia e normale/città.

  • Se si dispone di due versioni di ogni personaggio allora si avrebbe semplicemente bisogno di scrivere gli script del controller moralità richieste e attivare/disattivare la personaggi del gioco in base al quale si è utilizzando. Ecco come giochi come Final Fantasy 7,8,9 hanno ottenuto lo stesso effetto . C'erano due versioni dei personaggi del gioco: uno per la modalità battaglia e l'altro per la modalità normale.

2) Se le risorse sono un problema (e penso che un modo più efficiente)

è possibile utilizzare la funzione Application.LoadLevelAdditive. Questa funzione consente di caricare una scena diversa e invece di distruggere tutto nella scena corrente, prende la nuova scena e tutti gli oggetti e li aggiunge alla scena corrente. Quindi, in pratica si può usare qualcosa di simile:

  • Creare un battlescene separata e all'interno della vostra scena, creare un oggetto di gioco vuoto per contenere tutti gli oggetti nella scena.

  • Nella tua scena noraml fare lo stesso.

  • Quando avete bisogno di andare per utilizzare la modalità di battaglia:

    Application.LoadLevelAdditive ('battlescene');

  • E quando/se vuoi scaricare il tuo battlescene dopo di ciò puoi farlo semplicemente scrivendo il codice per distruggere l'oggetto di gioco battlescene poiché contiene tutto dalla tua scena di battaglia.

Come per il primo metodo è possibile decidere se si desidera avere due diverse versioni dei vostri caratteri o meno. Uno dei vantaggi di avere due versioni è che se vuoi risparmiare tempo non entrando nei dettagli con i tuoi modelli di gioco (specialmente se il tuo gioco è davvero grande) puoi risparmiare potenza di elaborazione usando modelli ridimensionati per la scena cittadina e usando modelli più dettagliati lucidati per la scena di battaglia, assumendo che la scena della battaglia sia un piccolo palcoscenico che rappresenta il luogo in cui i tuoi personaggi combattono. Pensa alla fantasia finale VII. Solo qualcosa da considerare.

Spero che questo aiuti. Ho scritto tutto in fretta, ma sappi che è necessario chiarire qualcosa.

+1

hey thx per le soluzioni .... ci provo io – Jason

+0

Nessun problema, spero che tutto funzioni. Fai un grido se hai bisogno di ulteriore aiuto. – amasiye

0

So che questo è un vecchio post, ma c'è un altro metodo che può essere utilizzato. Questo sarebbe per salvare lo stato della scena. Questo è utile quando non ci si aspetta che gli utenti abbiano le risorse per caricare 2 scene con Application.LoadLevelAdditive. Questo metodo potenzialmente può utilizzare il doppio delle risorse.

Quando si salva lo stato (salvare tutte le informazioni che possono essere modificate in un file o in un DB), è possibile caricare il livello in un secondo momento e non conservarlo nella memoria. Puoi anche usarlo per salvare il tuo gioco.

+0

È possibile aggiungere informazioni su * come * per salvare lo stato di una scena? La tua risposta implica l'esistenza di preesistenti funzioni 'SaveSceneState()' e 'RestoreSceneState()', che non penso esistano in Unity per impostazione predefinita. – Thomas

4

Puoi farlo da uno script in C#

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

E quando si desidera attivare il gioco di nuovo è possibile utilizzare Time.timeScale = 1;

Problemi correlati