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();
}
Code: Select all
public class MyClass
{
Modifiers = new MovementVariableModifierData[0];
}
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();
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.