Unity3d QuickTip – czyli szybkie porady, rozwiązania częstych problemów i sztuczki w Unity3d!

Dzisiejszy odcinek: Nieprzerwana muzyka/dźwięk między przejściami scen

Uwaga! Jest to poradnik typu QuickTip. Zatem skupia się on na osiągnięciu założonego celu. Zatem zakładamy że użytkownik zna na tyle program Unity3d, aby samodzielnie wykonać najprostsze czynności, jak np. dodanie modelu kostki do sceny czy dodanie modelowi jakiegoś komponentu. Jeżeli brakuje Ci tej podstawowej wiedzy, zapraszam do tutoriala:
Unity Tutorial – Podstawy

Jest to często spotykany na forach problem. Uruchamiamy początkowe menu gry, muzyczka radośnie sobie zaczyna lecieć w tle. Klikamy jakąś opcję, która powoduje zmianę sceny i nasza melodia nagle się urywa, żeby w następnej scenie włączyć się od nowa. Dziś zapobiegniemy temu zdarzeniu i sprawimy, że muzyka będzie grała, do póki my nie zdecydujemy inaczej.

Przygotowanie

Z racji, że operować będziemy na menu, za bazę posłuży jeden z poprzednich QuickTipów:

Nie ma znaczenia, które wybierzesz, możesz też mieć swoje własne. Byle był jakiś przycisk przenoszący na inną scenę. Ja operuje na menu teksturowym z QuickTipa #16, które możesz sobie pobrać w całości.

Najpierw musimy dokonać drobnej zmiany w kodzie jedynego pliku z tamtego tutoriala. W jedynym pliku btnScript.cs mieliśmy linijki:

if(levelToLoad == "Quit") {
	//Application.Quit();
	Debug.Log("Exit!");
} else {
	//Application.LoadLevel(levelToLoad);
	Debug.Log("Load Level: " + levelToLoad);
}

Musimy od komentować obie linie.

Następnie dodajemy sobie do zbioru assetów jakąś muzyczkę. Ja swoją ze strony: http://www.freesfx.co.uk/, która użycza swoich utworów w zamian za link o źródle.

Kolejny krok, to utworzenie nowej sceny. [File -> Save Scene As] Kluczowa jest nazwa nowej sceny. Nazywamy ją: “NewGame”. Dla odróżnienia, zaznaczamy główną kamerę i zmieniamy dla niej kolor tła w panelu Inspector, na dowolny, inny od domyślnego. Zapisujemy całość i wracamy do pierwotnej sceny. Dla poprawienia funkcjonalności, zmieniamy nazwę pierwszej sceny na “Options”. Dzięki temu, będziemy mogli sobie łatwo przechodzić między obiema scenami i dokładnie sprawdzić działanie projektu. Nazwę zmieniamy przez zaznaczenie obiektu i kliknięcie F2.

Potrzebujemy jeszcze uwzględnić sceny w projekcie. Wchodzimy w [File -> Build Settings] i tam dodajemy nasze sceny do panelu u góry, zwyczajnie je przeciągając.

Dźwięk na starcie

Najpierw zadbamy o to, żeby dźwięk odtworzył się przy uruchomieniu gry. Do tego celu tworzymy na scenie pusty GameObject [CTRL + Shift + N]. Ja nazwałem go SoundHolder. Następny krok, to stworzenie pliku skryptu, u mnie: menuMusic.cs. Skrypt przypisujemy od razu, do nowo utworzonego, pustego obiektu. Przyda się jeszcze komponent AudioSource, dodajemy go od razu: [Component -> Audio -> Audio Source]. Dodajemy do niego swoją muzykę i uzupełniamy tak ja na obrazku:

Ustawienia komponentu Audio Source
Ustawienia komponentu Audio Source

Czas na skrypt, który będzie aż komicznie prosty, bo całość wygląda tak:

using UnityEngine;
using System.Collections;

public class menuMusic : MonoBehaviour {

	void Awake () {
		DontDestroyOnLoad(gameObject);
	}

}

Zanim zostanie załadowana nowa scena, najpierw usuwane są wszystkie obiekty ze starej. Ta linijka wywołana w funkcji Awake (funkcja Start wykonuje się za późno), sprawia, że ten obiekt nie zostanie usunięty.

Usuwamy zwielokrotnienie muzyki

Możesz teraz przetestować program. Zauważysz pewnie, że wchodząc drugi raz do sceny pierwszej, dostaniemy nowy obiekt SoundHolder, przez co dźwięk będzie się nakładał. Aby uniknąć takiej sytuacji, zrobimy bardzo prostą sztuczkę. Mianowicie, stworzymy scenę, która będzie posiadała nasz SoundHolder i szybko ją przeładujemy na scenę menu.

Tworzymy sobie nową scenę. U mnie będzie to: PreLoader.

Jedyne co w niej umieszczamy, to nasz obiekt SoundHolder i zostawiamy główną kamerę z musu.

Wchodzimy znów w ustawienia budowania [CRTL + B]. Dodajemy tam naszą nową scenę, oraz ustawiamy ją na pierwszym miejscu. Zostaje nam trochę zmodyfikować kod skryptu menuMusic.cs.

using UnityEngine;
using System.Collections;

public class menuMusic : MonoBehaviour {

	void Awake () {
		DontDestroyOnLoad(gameObject);
		Application.LoadLevel("Options");
	}

}

Zachowujemy odtwarzacz dźwięku, po czym przechodzimy od razu na nową scenę. Teraz upewnij się, że jesteś na scenie PreLoader i uruchom grę. Dźwięk będzie uruchomiony tylko raz i zostanie z nami do czasu aż sami go usuniemy.

Jak go usunąć? Wystarczy wywołać funkcję Destroy na naszym SoudHolderze. Aby to zrobić, w wybranym momencie wystarczy wywołać:

Destroy(GameObject.Find("SoundHolder"));

 Gotowy przykład – Download

[to_like] https://dl.dropboxusercontent.com/u/7693850/QuickTip%2317.zip[/to_like]

Podoba Ci się? Udostępnij!