Mark Geschrieben 22. Oktober 2012 Melden Share Geschrieben 22. Oktober 2012 Basierend auf diesen Thread: http://forum.unity3d...ctices-Megapost habe ich mal ein kleines 1x1 zu der Unity internen Serialisierung zusammengefasst und aufgeschrieben. Bei der Unity Serialisierung geht es darum wie Unity die Elemente der Szene /Scripte speichert um sie beim start/beenden des Editors/Players wieder zu laden. Mit Serialisierung ist Speichern gemeint und mit Deserialisierung das Laden. Ausgangsbasis ist dieses kleine Script: public class TestScript : MonoBehaviour { public Foo memberFoo1; public Foo memberFoo2; } Nichts wird serialisiert, weil die Klasse Foo nicht mit [serializable] markiert wurde und nicht von ScriptableObject ableitet: public class Foo { ... } Die Instanz der Klasse wird jedes mal neu serialisiert wenn sie referenziert (benutzt) wird: [serializable] public class Foo { // Wird serialisiert/deserialisiert solange der Typ serialisierbar ist und die Sichtbarkeit auf public steht public int a; // Wird nicht serialisiert da es nicht public ist und nicht mit [serializeField] markiert wurde private bool b; // Wird serialisiert weil es mit [serializeField] markiert wurde auch wenn es private ist [serializeField] private float c; } Beispiel der Zuweisung: var fooInstance = new Foo(); member1Foo = fooInstance; member2Foo = fooInstance; // wird serialisiert auch wenn es bereits durch member1Foo serialisiert wird Die Instanz der Klasse wird nur ein einziges mal serialisiert/deserialisiert, weil die Klasse von ScriptableObject abgeleitet wurde: [serializable] public class Foo : ScriptableObject { // Der Konstruktor wird aufgerufen, aber eventuell zugewiesene Daten // könnten durch die Deserialisierung, welche nach dem erzeugen statt findet, // überschrieben werden public Foo() {} // Benutzt diese Methode als Ersatz zum Konstruktor um Daten // nach der Deserialisierung zu initialisieren, // dies wird direkt nach dem erstellen der Instanz und dem // Deserialisieren aufgerufen. void OnEnable() {} } Beispiel der Zuweisung: var fooInstance = ScriptableObject.CreateInstance<Foo>(); member1Foo = fooInstance; member2Foo = fooInstance; // hat auch nach der Deserialisierung die gleiche Instanz wie member1Foo Nur die Basisklasse Foo von Bar wird serialisiert/deserialisiert: [serializable] public class Foo { public int a; } [serializable] public class Bar : Foo { public int b; } Beispiel der Zuweisung: var barInstance = new Bar(); member1Foo = barInstance; // Nach der Deserialisierung ist der Typ des Inhaltes ein Foo und kein Bar Der tatsächliche Typ wird serialisiert/deserialisiert: [serializable] public class Foo : ScriptableObject { public int a; } [serializable] public class Bar : Foo { public int b; } Beispiel der Zuweisung: var barInstance = ScriptableObject.CreateInstance<Bar>(); member1Foo = barInstance; // Nach der Deserialisierung ist der Typ des Inhaltes Bar Verwendung der ScriptableObjects in Editoren/ausserhalb von Objekten der Szene: Um ScriptableObjects auch da zu verwenden wo es keine Szenen Elemente gibt, welche sie referenzieren, muss man ein speziellen Flag setzen, der besagt dass Unity diese ScriptableObject Instanz nicht zerstören soll wenn sie unbenutzt ist, dies geschieht mit dem hier: var fooInstance = ScriptableObject.CreateInstance<Foo>(); fooInstance.hideFlags = HideFlags.HideAndDontSave; Wenn man diesen Flag gesetzt hat muss man selbst die Lebenszeit des ScriptableObjectes bestimmen und mit: fooInstance.Destroy(); die Lebenszeit des Objektes beenden um keine Speicherlecks zu erzeugen. 3 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.