Jump to content
Unity Insider Forum

Unity Serialization


Mark

Recommended Posts

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...