Jump to content
Unity Insider Forum

MissingReferenceException bei null check


thewhiteshadow

Recommended Posts

Hallo,

ich bin dabei für ein SkriptableObject eine Visualisierung im Editor zu erstellen.

Diese erstellt ein Object aus einem Prefab und zeigt es solange an, wie das Asset im ProjektOrdner ausgewählt ist (über einen Custom Inspector). Ändert man etwas im Inspector, soll sich die Visualisierung ändern. Genauer bei dessen UI Image Komponente wird das sprite ausgetasuscht. Wählt man das Asset ab, wird das Visualisierungs-Objekt wieder gelöscht.

Bei der ersten Auswahl funktioniert es super. Auch im Spiel klappt es wunderbar.

Wenn ich das Asset jedoch im Editor ein zweites mal auswähle (oder ein anderes vom gleichen Typ), spinnt er rum.

Es wird eine MissingReferenceException geworfen, wenn ich das image auf null prüfe.

 

		private Image image{
			get{
				if (gameObject != null && _image == null) //<-- Error!
					_image = GetComponent<Image>();
				return _image;
			}
		}

Ich muss das Objekt für die Visualisierung dynamisch erzeugen, weil es nicht regulärer Bestandteil der Szene ist und im Spiel auch erst zur Laufzeit erzeugt wird.

Ich denke, er bekommt das mit dem DestroyImmediate und anschließenden Instantiate nicht auf die Reihe, aber warum wirft er den Fehler bei der null Abfrage?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich weiss nicht genau ob das dein Problem verursacht. Aber wenn du DestroyImmediate machst,  wird das Objekt sofort zerstört, auch wenn der Updatezyklus noch nicht beendet ist. Das kann problematisch sein, wenn andere Dinge in diesem Frame noch auf dieses Objekt verweisen.

https://docs.unity3d.com/ScriptReference/Object.DestroyImmediate.html

 

Versuch mal das normale Destroy.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, das Image ist es nicht, es ist das gameObject.

MissingReferenceException: The object of type 'SpriteAvatar' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
TWS.Dialogs.SpriteAvatar.get_image () (at Assets/Scripts/Dialog/SpriteAvatar.cs: 60 )

55: get {
60: if (gameObject != null &&
65:   _image == null)
66:    _image = GetComponent<Image>();
// Ich hab die leeren Zeilennummern ausgelassen

Ich weiß, dass der == und != Operator bei GameObject überladen ist (was das schlechteste API-Desing ist was ich je gesehen hab), aber dass er eine Exception auslösen kann, halte ich für außerst eigenartig.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ah, okay. Die Komponente, in der dieser Code läuft, ist zerstört, weswegen man nicht mehr auf dessen GameObject zugreifen darf. Der ==-Operator löst hier also nichts auf. Denk daran, dass "gameObject" eigentlich "this.gameObject" ist, und da passiert eben der Fehler.

Dein get_image sollte also gar nicht erst mehr ausgeführt werden. Der Null-Check ist daher nicht an dieser Stelle nötig, sondern eine Ebene darüber.

if (spriteAvatar != null)
{
  DoSomethingWith(spriteAvatar.image);
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...