Unity erklärte am 25. Oktober 2012 in einem technischen Beitrag, warum Daten aus selbst entwickelten Editor-Erweiterungen nach dem Wechsel in den Play-Modus verschwinden können. Beim Neuladen einer Assembly werden die verwalteten Mono-Bestandteile der Engine neu geladen. Nicht serialisierte Werte aus einem Editorfenster gehen dabei verloren.
Die Serialisierung überträgt Datenstrukturen in den nativen Speicher von Unity und kann sie später wieder in eine verwaltete Struktur zurückführen. Derselbe Mechanismus ist die Grundlage dafür, Daten in Assets abzulegen und beim nächsten Öffnen eines Projekts wiederherzustellen.
Serializable Klassen und begrenzte Struct-Unterstützung
Im Beispiel des Unity-Beitrags müssen die beteiligten Klassen und Felder für die Serialisierung vorbereitet werden. Eine mit [Serializable] markierte Klasse kann ihre Werte über einen Assembly-Reload hinweg erhalten. Structs werden dagegen nur eingeschränkt unterstützt. Im Beispiel bleibt der Wert einer verschachtelten Struktur zunächst nicht erhalten, bis daraus eine Klasse gemacht wird.
Für Editorwerkzeuge ist diese Unterscheidung praktisch wichtig. Ein Fenster kann intern korrekt funktionieren und trotzdem nach dem Neuladen leer erscheinen, wenn die Referenz auf die Datenstruktur nicht serialisierbar ist. Die Regeln betreffen damit nicht nur die Speicherung von Assets, sondern auch den Zustand von Entwicklungswerkzeugen.
ScriptableObjects halten Referenzen zusammen
Bei normalen Klassen speichert Unity Felder einzeln. Zwei Felder, die vor dem Neuladen auf dasselbe Objekt zeigen, können danach auf getrennte Kopien verweisen. Das erschwert komplexe Beziehungen zwischen Datenobjekten. ScriptableObjects werden dagegen als Referenzen serialisiert und eignen sich deshalb für gemeinsam genutzte Datenstrukturen.
Die Unity-Editorwerkzeuge moderner Spieleprojekte bauen weiterhin auf stabilen Datenmodellen auf. Wer eigene Importer, Fenster oder Asset-Pipelines entwickelt, sollte deshalb unterscheiden, welche Werte nur temporär sind und welche Zustände einen Reload oder den nächsten Projektstart überstehen müssen.
