Haegar Geschrieben 23. März 2019 Melden Share Geschrieben 23. März 2019 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 More sharing options...
Sascha Geschrieben 23. März 2019 Melden Share Geschrieben 23. März 2019 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 More sharing options...
Haegar Geschrieben 24. März 2019 Autor Melden Share Geschrieben 24. März 2019 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 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 24. März 2019 Melden Share Geschrieben 24. März 2019 Wenn du ein Element machst, da die Werte einstellst, und dann die Anzahl der Elemente erhöhst, dann haben alle neuen Elemente dieselben Werte. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
TurTur Geschrieben 25. März 2019 Melden Share Geschrieben 25. März 2019 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 More sharing options...
TurTur Geschrieben 25. März 2019 Melden Share Geschrieben 25. März 2019 Es wird zwar richtig initialisiert, lässt sich im Editor aber nicht mehr ändern. Sorry Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 25. März 2019 Melden Share Geschrieben 25. März 2019 @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 More sharing options...
TurTur Geschrieben 25. März 2019 Melden Share Geschrieben 25. März 2019 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 More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.