Jump to content
Unity Insider Forum

System.Serializable: Werte vorgeben


Haegar

Recommended Posts

Hallo *,

ich habe das Problem, dass ich bei eigenen Klassen keine Werte vorgeben kann.

So habe ich beispielsweise folgende Klasse:

[System.Serializable]
public class cGewinnSplit {
    public int Geldgewinn = -1;
    public int GeldsplitA = -1;
    public int GeldsplitB = -1;
    public int GeldSofortAddier = -1;
}

public cGewinnSplit[] GewinnSplit;

Sobald ich im Inspektor das Array erzeuge / erweitere, bekommen die Variablen alle den Wert 0 statt -1.

Gibt es eine Möglichkeit, dass die Variablen alle den voreingestellten Wert - in meinem Beispiel -1 - beim Erzeugen zugewiesen bekommen?

 

Danke für eure Hilfe

Ulrich

Link zu diesem Kommentar
Auf anderen Seiten teilen

Heyo Haegar!

Das ist echt ne harte Nuss, die du da hast. Die thermonukleare Lösung wäre ein Editor-Script, das ein anderes Verhalten als den Standard-Drawer für Arrays an den Tag legt, indem es gezielt bei neuen Objekten z.B. einen Konstruktor aufruft. Bei ReorderableLists geht das ganz gut, bei normaler Array-Anzeige wüsste ich nicht, wie das geht, ohne den ganzen Drawer neuzuschreiben.

Eine alternative Option, die ich gefunden habe, wäre ein ISerializationCallbackReceiver, der aber nur dann notgedrungen funktioniert, wenn der Zustand, dass alle Felder den Wert 0 haben, im Anwendungsfall ausgeschlossen ist. Die andere würde über OnValidate laufen und hat dasselbe Problem, da man mit beiden Methoden einfach nicht mit Sicherheit sagen kann, ob ein Objekt gerade frisch erzeugt wurde oder eben aus anderen Gründen zufälligerweise überall 0 als Wert hat.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Haegar,

der Hinweis von Sascha auf " ISerializationCallbackReceiver " hat mich auf eine Idee gebracht, die ich mal im Zusammenhang mit ScriptableObjects gefunden habe.
Dort wird das "OnAfterDeserialize()"-Event verwendet, um Defaultwerte zu prüfen/setzen.

 

[Serializable]
public class cGewinnSplit: ISerializationCallbackReceiver
{
    public int Geldgewinn;
    public int GeldsplitA;
    public int GeldsplitB;
    public int GeldSofortAddier;

    public void OnAfterDeserialize()
    {
        Geldgewinn = -1;
        GeldsplitA = -1;
        GeldsplitB = -1;
        GeldSofortAddier = -1;
    }

    public void OnBeforeSerialize() { }

}

 

Für deinen Anwendungsfall (Array) scheint es zu funktionieren, auch im Editor.

Gruß

TurTur

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

@TurTur OnAfterDeserialize wird immer aufgerufen, wenn das Objekt geladen wird, und zwar, wie der Name schon andeutet, nach dem Laden der Werte. Das geht schon los, wenn du den Play Mode startest. Da wird die gesamte Szene einmal serialisiert und wieder deserialisiert, und dann sind die eingegebenen Werte halt futsch. Deshalb wäre die Idee, mit einer If-Abfrage zu schauen, ob das Objekt "frisch" ist, also überall nur 0 drinsteht. Und deshalb mein Kommentar:

Am 24.3.2019 um 00:41 schrieb Sascha:

ISerializationCallbackReceiver, der aber nur dann notgedrungen funktioniert, wenn der Zustand, dass alle Felder den Wert 0 haben, im Anwendungsfall ausgeschlossen ist.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Sascha,

Stimmt leider genauso.
Die Idee ging auf eine Lösung für ein ScriptableObject zurück, für das ein Initialwert eingetragen wird, der dann beim Start (Playmodus) einer "RunTimevariable" zugewiesen wird, mit der Möglichkeit der Reinitialisierung.
Von Nachteil ist in diesem Fall aber die Tatsache, das diese Runtime-Variable als [NONSERIALIZED] definiert werden muss (aus den von dir genannten Gründen) und damit leider auch nicht im Inspector zu sehen ist.
Und da ich vermute das  Haegar  Daten auch im Inspector eingeben will, ist die einfachste wohl auch die beste Lösung .

Gruß
TurTur

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...