2016-04-15 8 views
0

Ich habe eine Szene, die ich neu laden möchte, wenn ein Player ausfällt. Ich tue dies mit SceneManager.LoadScene("MainScene"); aber dann habe ich diesen Fehler:Zurücksetzen des Ereignis-Abonnements beim Zurücksetzen der Szene (Nachladen)

MissingReferenceException: The object of type 'AudioSource' has been destroyed but you are still trying to access it.

Nach einigem Graben fand ich, dass das Problem von mir Ereignissen verursacht wird. Es sieht so aus, als seien die Abonnenten der vorherigen Szene noch aktiv und suchen nach Objekten, die bereits zerstört wurden. So Fragen sind:

  1. Ist es möglich, irgendwie alle Teilnehmer zu löschen, oder muss ich sie abmelden einzeln vor dem Laden neuer Szene?
  2. (Ich weiß, dass ich das nicht fragen sollte, aber ...) Können Sie mich auf ein Tutorial oder ein Beispiel für einen einfachen Event Manager hinweisen? Ich denke über eine statische Klasse nach, die meine Eventhandler umschließt und es mir ermöglicht, Abonnements zu verwalten.

Antwort

0

.Es ist möglich, alle Abonnenten zu löschen, aber es ist besser, in jedem Skript abmelden Sie abonniert in. Das ist nicht schwer. Abbestellen in der OnDisable() Funktion in jeder Klasse, die Sie ein Ereignis abonniert haben, und Sie haben nicht das Problem, das Sie gerade haben.

CLEAR Einzelveranstaltung:

void OnDisable(){ 
ClassName.eventName -= functionName; 
} 

Alle Ereignisse löschen:

Wenn das Ereignis Unity UI Event Sie RemoveAllListeners() können alle Abonnenten entfernen.

Sie Angenommen verwenden C# event und delegates, und den Namen Sie Delegierten ist buttonPressed während der Name Ihres EreignisonButtonPressed ist, können Sie ein Teilnehmer entfernen, indem

tun
if (onButtonPressed != null) 
    { 
     System.Delegate[] deletegates = onButtonPressed.GetInvocationList(); 
     for (int i = 0; i < deletegates.Length; i++) 
     { 
      //Remove all event 
      onButtonPressed -= deletegates[i] as buttonPressed; 
     } 
    } 

. Ich weiß nicht, was Sie tun, aber Sie brauchen nicht Event Manager. Einfach abonnieren und abmelden in der OnDisable Funktion. Sie können den Event Manager here bekommen, wenn Sie ihn noch brauchen.

+0

Nachdem ich meine Frage geschrieben habe, habe ich den OnDisable() Weg versucht und es funktioniert, aber ich wartete auf einige Antworten, weil diese Lösung mir nicht sehr elegant erschien. Danke –

+1

In der OnDisable() Funktion zu tun ist der richtige Weg. Es ist garantiert, jedes Mal zu arbeiten. Sie können die Ereignismethode "Alle löschen" verwenden oder Ihren eigenen Event Manager erstellen, wenn Sie möchten. Hier erfahren Sie, wie Unity Ereignisse behandelt: https://unity3d.com/learn/tutorials/modules/intermediate/scripting/events – Programmer