Изменения внедорожных не сохранены для пользовательских полей редактора, которые хранят данные для сложного объектаC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Изменения внедорожных не сохранены для пользовательских полей редактора, которые хранят данные для сложного объекта

Сообщение Anonymous »

Я создал собственный компонент, использующий специальный редактор.
В этом редакторе я установил несколько полей. При сохранении префаба сохраняются только некоторые из этих полей. В частности, обычные поля, такие как int, string, float, сохраняются нормально. Но у меня есть поля, в которых хранятся данные следующей структуры:

Код: Выделить всё

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

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

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

}
Более того, класс, для которого используется редактор, фактически сохраняет данные в массиве этой структуры, то есть в массиве MovementVariableModifierData[] Modifiers. например:

Код: Выделить всё

public class MyClass
{
Modifiers = new MovementVariableModifierData[0];
}
В пользовательском инспекторе поля изменяются так же, как и в методе oninspeporgui :

Код: Выделить всё

// 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();
По сути, целевой класс пользовательского редактора имеет массив MovementVariableModifierData[] и содержит некоторые поля Dictionary, которые я пытаюсь обновить и сохранить через специальный редактор.
Кажется, что данные обновляются нормально, когда я использую Debug.Log(), и они правильно отображаются в инспекторе, но когда я сохраняю префаб а затем закройте и снова откройте его, значения, хранящиеся в словарях, сбрасываются. Значение, хранящееся в поле int/string modifierItemID и modifierItenIdx, и добавление новых записей MovementVariableModifierData в массив Modifiers также успешно сохраняется (но опять же, не их словарные значения ).
Я заметил одну вещь: хотя возвращаемые значения верны, при следующем вызове OnInspectorGUI() словари сбрасываются.
Я ломаю голову и не могу хоть убей понять, почему сбрасываются только словари, но не int и строка. Я пометил их и класс, частью которого они являются, как [Сериализуемые]. Я также пробовал использовать List вместо словарей для хранения данных, но проблема осталась.

Подробнее здесь: https://stackoverflow.com/questions/793 ... -a-complex
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»