Jump to content
Unity Insider Forum
Sign in to follow this  
Haegar

System.Serializable: Werte vorgeben

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Hi Sascha,

danke für Deien Antwort. Ich hätte nicht gedacht, dass dies so kompliziert ist. Nungut, dann nehme ich es so hin wie es ist und ändere die Werte beim Erzeugen manuell...

Ulrich

Share this post


Link to post
Share on other sites

Wenn du ein Element machst, da die Werte einstellst, und dann die Anzahl der Elemente erhöhst, dann haben alle neuen Elemente dieselben Werte.

Share this post


Link to post
Share on other sites

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

 

Edited by TurTur
P.S. Klappt doch nicht so ganz

Share this post


Link to post
Share on other sites

@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.

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

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

Loading...
Sign in to follow this  

×
×
  • Create New...