2012-11-21 7 views
11

Wykonuję turową grę bitewną w Unity3D i mam 2 sceny (scena miasta i scena bitwy). Za każdym razem, gdy postać spotyka potwora, gra przeskakuje na scenę bitwy, w której postać walczy i wraca do miasta po pokonaniu lub przegranej.Jedność przechodząca do innej sceny z bieżącą sceną zatrzymaną

Problemem jest to, w jaki sposób, aby powrócić do sceny miasta z takim samym stanie jak wtedy, gdy bohater wkracza na scenę Battle (pozycja znaku, statusy, itd.)

jeśli używam

Application.LoadLevel('battlescene'); 

następnie

Application.loadLevel('townScene'); 

to scena miasta rozpocznie się po raz pierwszy. Jak sprawić, by gra miejska była kontynuowana od miejsca, w którym skończyliśmy?

Odpowiedz

15

Są dwa sposoby, według których można to osiągnąć. To wszystko zależy od platformy docelowej i jak ważne są zasoby, ale tutaj mamy przejść:

1) Jeśli środki nie są problemem

Można umieścić wszystkie swoje normalne sceny i walka sceny przedmioty w jednej scenie .

  • Tworzenie dwóch pustych obiektów gry (jeden dla obiektów miasta scena, a inne dla sceny walki Objects). Możesz wtedy mieć dwie wersje postaci lub jednej z nich. Następnie napisz scenariusz, który po prostu przełącza kamerę (kamery) ze sceny miejskiej na scenę bitwy, gdy wyzwala bitwę i wraca do sceny miasta, gdy bitwa jest zakończona .

  • Jeśli posiadasz jedną wersję każdego znaku, możesz po prostu dodać skrypt, który zmienia zachowanie kontrolera znaków gry na/z trybu walki i normalnego/miejskiego trybu.

  • Jeśli masz dwie wersje każdego znaku wtedy wystarczy napisać odpowiednie skrypty kontrolera znaków i włączyć/wyłączyć znaki gry według których jeden jesteś użyciu. W ten sposób gry takie jak Final Fantasy 7,8,9 osiągnęły ten sam efekt . Istniały dwie wersje postaci z gry: jedna do trybu walki, a druga do trybu normalnego.

2) Jeśli zasoby są problemem (i myślę, że bardziej efektywny sposób)

Można użyć funkcji Application.LoadLevelAdditive. Ta funkcja pozwala załadować inną scenę i zamiast niszczyć wszystko w bieżącej scenie, pobiera nową scenę i wszystkie jej obiekty i dodaje je do bieżącej sceny. Więc w zasadzie można go używać coś takiego:

  • Utwórz osobny battlescene oraz w scenie, utworzyć pusty obiekt gry trzymać każdy obiekt w scenie.

  • Na swojej scenie noraml zrób to samo.

  • Kiedy trzeba, aby przejść do trybu bojowego użycia:

    Application.LoadLevelAdditive ('battlescene');

  • A kiedy/jeśli chcesz zwolnić battlescene po tym można zrobić tak po prostu pisanie kodu do niszczenia obiektu battlescene grę ponieważ zawiera wszystko ze swojej bitwy sceny.

Podobnie jak w przypadku pierwszej metody można zdecydować, czy chcesz mieć dwie różne wersje swoich bohaterów, czy nie. Jedną z zalet posiadania dwóch wersji jest to, że jeśli chcesz zaoszczędzić czas, nie zagłębiając się w szczegóły z twoimi modelami gry (szczególnie, jeśli twoja gra jest naprawdę duża), możesz oszczędzać moc obliczeniową, używając skalowanych modeli dla sceny miasta i za pomocą dopracowanych, bardziej szczegółowych modeli sceny bitwy, zakładając, że twoja scena walki jest małą sceną reprezentującą miejsce, w którym walczą twoje postacie. Pomyśl o końcowej fantazji VII. Po prostu coś do rozważenia.

Mam nadzieję, że to pomaga. Napisałem to wszystko w pośpiechu, ale jestem pewien, że jeśli cokolwiek potrzebuje oczyszczenia.

+1

hej thx za rozwiązania .... spróbuję – Jason

+0

Nie ma problemu, mam nadzieję, że wszystko się ułoży. Daj okrzyk, jeśli potrzebujesz dodatkowej pomocy. – amasiye

0

Wiem, że to stary post, ale jest jeszcze jedna metoda, która może być użyta. Byłoby to uratować stan sceny. Jest to przydatne, gdy nie oczekujesz, że użytkownicy będą mieli zasoby do ładowania 2 scen za pomocą Application.LoadLevelAdditive. Ta metoda potencjalnie może wykorzystywać dwa razy więcej zasobów.

Po zapisaniu stanu (zapisaniu wszystkich informacji, które można zmienić na plik lub DB), można załadować poziom później i nie mieć go w pamięci. Możesz również użyć tego do zapisania gry.

+0

Czy możesz dodać informacje dotyczące * sposobu * zapisywania stanu sceny? Twoja odpowiedź implikuje istnienie wcześniejszych funkcji 'SaveSceneState()' i 'RestoreSceneState()', które domyślnie nie istnieją w Unity. – Thomas

4

Można to zrobić przez skrypt w języku C#

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

A kiedy chcesz aktywować grę z powrotem można użyć Time.timeScale = 1;

Powiązane problemy