Vorgefertigte Änderungen werden für benutzerdefinierte Editorfelder, in denen Daten für ein komplexes Objekt gespeichertC#

Ein Treffpunkt für C#-Programmierer
Guest
 Vorgefertigte Änderungen werden für benutzerdefinierte Editorfelder, in denen Daten für ein komplexes Objekt gespeichert

Post by Guest »

Ich habe eine benutzerdefinierte Komponente erstellt, die einen benutzerdefinierten Editor verwendet.
In diesem Editor habe ich eine Reihe von Feldern festgelegt. Beim Speichern des Fertigteils werden nur einige dieser Felder gespeichert. Insbesondere normale Felder wie int, string, float lassen sich problemlos speichern. Aber ich habe einige Felder, die Daten für die folgende Struktur speichern:

Code: Select all

    [System.Serializable]
public class MovementVariableModifierData
{
[ItemType]
public string modifierItemID = "";
public int modifierItemIdx;

[SerializeField]
public Dictionary multipliers = new Dictionary();

[SerializeField]
public Dictionary addends = new Dictionary();

}
Darüber hinaus speichert die Klasse, für die der Editor verwendet wird, tatsächlich Daten in einem Array dieser Struktur, also in ein movementVariablemodifierData [] Modifikatoren Array. z. B.:

Code: Select all

public class MyClass
{
Modifiers = new MovementVariableModifierData[0];
}
Im benutzerdefinierten Inspektor werden die Felder wie folgt innerhalb der OnInspectorGUI-Methode geändert:

Code: Select all

// Custom Editor Code:

// read old values and copy them to new list
tmpModifiers = new List(Modifiers)

for (int i = 0; i < tmpModifiers.Count; i++)
{
// MODIFY Int and String - these get saved
tmpModifiers[i].modifierItemIdx = EditorGUILayout.Popup(new GUIContent("Item ID:"), tmpModifiers[i].modifierItemIdx, itemTypes);
tmpModifiers[i].modifierItemID = itemTypes[tmpModifiers[i].modifierItemIdx];

// MODIFY Dictionary - Doesn't get saved
// Set default value
if (!tmpModifiers[i].multipliers.ContainsKey("Key1")) tmpModifiers[i].multipliers["Key1"] = 1.0f;

tmpModifiers[i].multipliers["Key1"] = EditorGUILayout.FloatField(new GUIContent("Key 1:"), tmpModifiers[i].multipliers["Key1"]);

// There's many more of these in the loop but they all use this exact pattern.

}

Modifiers = tmpModifiers.ToArray();
Im Grunde hat die Zielklasse des benutzerdefinierten Editors also ein MovementVariableModifierData[]-Array und es enthält einige Dictionary-Felder, die ich versuche Aktualisieren und speichern Sie über den benutzerdefinierten Editor.
Die Daten scheinen sich einwandfrei zu aktualisieren, wenn ich Debug.Log() sie verwende, und sie werden im Inspektor korrekt angezeigt, aber wenn ich das Fertighaus speichere und dann schließen und erneut öffnen, die Werte werden gespeichert in den Wörterbüchern zurückgesetzt. Der im int/string-Feld von modifierItemID und modifierItenIdx gespeicherte Wert und das Hinzufügen neuer MovementVariableModifierData-Einträge zum Modifiers-Array werden ebenfalls erfolgreich gespeichert (jedoch wiederum nicht ihre Wörterbuchwerte). ).
Eine Sache, die mir aufgefallen ist, ist, dass die zurückgegebenen Werte zwar korrekt sind, die Wörterbücher jedoch beim nächsten Aufruf von OnInspectorGUI() zurückgesetzt wurden.
Ich Ich zerbreche mir den Kopf und kann beim besten Willen nicht herausfinden, warum nur die Wörterbücher zurückgesetzt werden, nicht aber int und string. Ich habe sie und die Klasse, zu der sie gehören, als [Serialisierbar] markiert. Ich habe auch versucht, List anstelle von Wörterbüchern zu verwenden, um die Daten zu speichern, und das Problem besteht immer noch.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post