thewhiteshadow Geschrieben 7. Mai 2019 Melden Share Geschrieben 7. Mai 2019 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 More sharing options...
malzbie Geschrieben 8. Mai 2019 Melden Share Geschrieben 8. Mai 2019 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 More sharing options...
thewhiteshadow Geschrieben 8. Mai 2019 Autor Melden Share Geschrieben 8. Mai 2019 Danke für die Antwort. Im Editor gibt es keine "Frames" (nur Event getriggerte Updates) und dort funktioniert Destroy alleine nicht. Im Spiel führt DestroyImmediate zu keinen Problemen, auch wenn ich mir schon überlegt habe, ggf. einen Fork einzubauen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 8. Mai 2019 Melden Share Geschrieben 8. Mai 2019 Eigentlich kann deine Zeile diese Exception nicht auslösen. Schau mal nochmal, ob das überhaupt die richtige Zeile ist. Vielleicht ist dein Compiler wegen irgendeiner Caching-Geschichte auch in der Zeile verrutscht. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
thewhiteshadow Geschrieben 8. Mai 2019 Autor Melden Share Geschrieben 8. Mai 2019 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 More sharing options...
Sascha Geschrieben 8. Mai 2019 Melden Share Geschrieben 8. Mai 2019 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 More sharing options...
thewhiteshadow Geschrieben 8. Mai 2019 Autor Melden Share Geschrieben 8. Mai 2019 ich dachte eigentlich, das ich das tue 😕 // Avatar ist das Custom-Skript, in der der Code aus meinem vorherigen Post steht. if (avatar != null) { avatar.Speaking = false; avatar.Active = false; } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
thewhiteshadow Geschrieben 8. Mai 2019 Autor Melden Share Geschrieben 8. Mai 2019 Ich hab den Fehler durch ein wenig refactoring behoben, auch wenn ich immer noch nicht genau nachvollziehen kann, warum der Fehler auftritt. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 8. Mai 2019 Melden Share Geschrieben 8. Mai 2019 Wenn du damit einen Fehler behoben hast, ist es kein Refactoring Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.