Jump to content
Unity Insider Forum

Verständnisfrage Sound


SyntaxTalkstoMe

Recommended Posts

Nabend,

ich hatte das Problem, dass die die Spielmusik nach dem Scenenwechsel nicht gestartet hat. Ich hatte es an einen boolean geknüpft, wenn man auf "Neues Spiel" drückt geknüpft. Soweit so gut.

Das Skript für die Backgroundmusik habe ich auf die Spielkamera gelegt über ein SerializedField.

Aber jetzt meine Frage:

Warum wird mit dem Code keine Musik abgespielt:

[Serialized Field]
public Audiosource backgroundMusic;

private void Update()
    {
	PlayBackgroundMusic();
    }


void PlayBackgroundMusic()
    {
        if(this.gameObject != null && gameStartet && backgroundMusic != null && !musicPaused)
        {
            if (!backgroundMusic.isPlaying && !musicPause)
            {
                backgroundMusic.Play();
            }      
        }
    }

 

Aber mit diesem Code funzt es?

void Update()
{

        if (gameStartet)
        {
            PlayBackgroundMusic();
        }

}

 

Der einzige unterschied ist, dass ich die Abfrage (if gamestartet) schon außerhalb abfrage und nicht innerhalb der Methode. Aber ich versteh nicht warum. Wenn die Bediegung in der Methode abgefragt ist und diese wird nicht erfüllt, passiert eben nichts.

 

 

Gruß und einen schönen 2.ten Weihnachtstag

Link zu diesem Kommentar
Auf anderen Seiten teilen

Puh!
Du musst echt noch ein wenig an deinem Codeverständnis arbeiten. Vorallem an der Logik von Abfragen und den Zuständen von Variablen, Komponenten und Gameobjekten.
Vorneweg: Ich sehe jetzt selber keinen Grund, warum das eine geht und das andere nicht. Ich sehe aber auch nicht wo gameStarted gesetzt wird.

Trotzdem werde ich dir mal den Code zerpflücken und dir hoffentlich etwas Klarheit geben.

 if (this.GameObject != null)

This ist die Klasse selbst, in der diese Abfrage steht. Dieses Script liegt auf einem Gameobject in der Szene. Das muss sogar so sein, denn in einer Szene kann keine Komponente existieren, wenn sie nicht auch auf einem Gameobjekt liegt. Somit ist die Abfrage komplett sinnlos.
Du denkst dir jetzt sicherlich, dass es doch auch Klassen gibt, die nicht auf Objekten in der Szene sein müssen und trotzdem funktionieren, so wie die Mathf. Klasse.
Ja natürlich. Diese sind aber Static und laufen nicht selbstständig ab. Erben also nicht von Monobehaviour, und haben auch keine Awake/Start/Update Funktionen.

if (this.GameObject != null && gameStarted)

Irgendwo wird diese Variable aus irgendeinen Grund auf true gesetzt. Möglicherweise wird sie auch irgendwo wieder auf false gesetzt. Wo, wann und warum diese Variable ihren Wert bekommt, weiß ich nicht. Diese Variable könnte aber eben das Probelm verursachen.

if (this.GameObject != null && gameStarted && backgroundMusic =! null)

Hier fragst du ab, ob denn die Referenzvariable backgroundMusic, die vom Typ Audiosource ist,  auch wirklich auf eine Komponente verweist. Das ist gut, denn wenn man eine Komonente ansprechen will, die nicht bekannt ist, wird ein Fehler ausgeworfen. Ich perönlich würde aber aus Debug-Gründen diese Abfrage einzeln und als erstes machen. 

 

if(backgroundMusic=!null){
  if(irgendwas){// weitere mögliche Abfragen, wenn nötig
    // hier die Audiosource steuern
  }
}
else{
  // Hier springe ich nur rein, wenn die Variable keinen Verweis auf eine Komponente hat.
  print("backgroundMusic hat keine Audiosource zugewiesen");
}

Wenn du also keine Komponente zugewisen hast, würde der Code idr eine Meldung raus werfen. Damit hättest du eine Fehlerquelle schon einmal abgedeckt.

if (this.GameObject != null && gameStarted && backgroundMusic =! null && !musicPaused)

Wieder eine Variable, die du irgendwo setzt, wenn irgend etwas eintritt. Auch hier weiß ich nicht wo und wann das passiert.
Diese Abfrage machst du gleich 2 Mal hintereinander, denn in der nächsten Zeile

if(!backgroundMusic.isPlaying && !musicPause)

steht sie wieder drin. Oder ist das etwa eine weitere Variable, weil musicPause ohne D da drin steht? Wenn's eine weitere Variable ist, dann ist es ganz blöd, davon gehe ich jetzt mal nicht aus. Du hast wahrscheinlich nur einen Fehler beim Übertragen des Codes gemacht.
Da aber in deiner oberen Abfrage schon klar ist, dass der Code nur dann ausgeführt wird, wenn musicPaused false ist, ist eine weiter Abfrage sinnlos und verkompliziert nur den Code und dessen Lesbarkeit.

Wenn alle deine Bedingungen wahr sind, den das macht ja eine if-Abfrage, das ermitteln ob alle Bedingungen zusammen true oder false ergeben, dann wird die verknüpfte Audiosource gestartet. Also nur, wenn deine Audiosource nicht schon was abspielt, wird sie gestartet.

Du siehst also, dass es schwierig ist, deinen Code zu entschlüsseln, weil zu viele unnötige Abfragen da drin sind. Außerdem werden Variablen abgefragt, über dessen Zustände wir nichts wissen.
Wann und vorallem warum wird musicPaused und gameStarted auf true bzw. false gesetzt. Sind diese 2 Variablen evtl. noch woanders mit der Audiosource verknüpft und hebeln sich dewegen aus?
Ich weiß es nicht. Aber du kannst es rausfinden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...