Кастомный инспектор не сохраняет данные
Сделал инспектор для ScriptableObject, но после переоткрытия проекта все данные сбрасываются к исходным.
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
[CreateAssetMenu(fileName = "ItemData", menuName = "ScriptableObjects/ItemData", order = 2)]
public class ItemData : ScriptableObject
{
[SerializeField] private Sprite _icon;
private string _name;
private string _description;
private int _maxInStack;
private float _weight;
private bool _isEatable = false;
private int _calories;
private int _water;
public Sprite Icon => _icon;
public string Name => _name;
public string Description => _description;
public float Weight => _weight;
public int MaxInStack => _maxInStack;
public bool IsEatable => _isEatable;
public int Calories => _calories;
public int Water => _water;
#region Editor
#if UNITY_EDITOR
[CustomEditor(typeof(ItemData))]
public class ItemDataEditor : Editor
{
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
ItemData data = (ItemData)target;
EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Name", GUILayout.MaxWidth(80));
data._name = EditorGUILayout.TextField(data._name, GUILayout.MaxWidth(120));
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Description", GUILayout.MaxWidth(80));
data._description = EditorGUILayout.TextArea(data._description);
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Weight", GUILayout.MaxWidth(80));
data._weight = EditorGUILayout.FloatField(data._weight, GUILayout.MaxWidth(40));
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Max In Stack", GUILayout.MaxWidth(80));
data._maxInStack = EditorGUILayout.IntField(data._maxInStack, GUILayout.MaxWidth(40));
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Is Eatable", GUILayout.MaxWidth(80));
data._isEatable = EditorGUILayout.Toggle(data._isEatable, GUILayout.MaxWidth(40));
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal();
if (data._isEatable)
{
EditorGUILayout.LabelField("Calories", GUILayout.MaxWidth(80));
data._calories = EditorGUILayout.IntField(data._calories, GUILayout.MaxWidth(40));
EditorGUILayout.LabelField("Water", GUILayout.MaxWidth(80));
data._water = EditorGUILayout.IntField(data._water, GUILayout.MaxWidth(40));
}
EditorGUILayout.EndHorizontal();
serializedObject.ApplyModifiedProperties();
}
}
#endif
#endregion
}
Ответы (1 шт):
Автор решения: Psyxoz0x13
→ Ссылка
Если хотите изменять приватные поля, тогда сериализуйте их
using UnityEditor;
using UnityEngine;
[CreateAssetMenu(fileName = "ItemData", menuName = "ScriptableObjects/ItemData", order = 2)]
public class ItemData : ScriptableObject
{
[SerializeField] private Sprite _icon;
[SerializeField, HideInInspector] private string _name;
[SerializeField, HideInInspector] private string _description;
[SerializeField, HideInInspector] private int _maxInStack;
[SerializeField, HideInInspector] private float _weight;
[SerializeField, HideInInspector] private bool _isEatable = false;
[SerializeField, HideInInspector] private int _calories;
[SerializeField, HideInInspector] private int _water;
public Sprite Icon => _icon;
public string Name => _name;
public string Description => _description;
public float Weight => _weight;
public int MaxInStack => _maxInStack;
public bool IsEatable => _isEatable;
public int Calories => _calories;
public int Water => _water;
[CustomEditor(typeof(ItemData))]
public class ItemDataEditor : Editor
{
public override void OnInspectorGUI()
{
DrawPropertiesExcluding(serializedObject, "m_Script");
EditorGUI.BeginChangeCheck();
ItemData data = (ItemData)target;
EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Name", GUILayout.MaxWidth(80));
data._name = EditorGUILayout.TextField(data._name, GUILayout.MaxWidth(120));
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Description", GUILayout.MaxWidth(80));
data._description = EditorGUILayout.TextArea(data._description);
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Weight", GUILayout.MaxWidth(80));
data._weight = EditorGUILayout.FloatField(data._weight, GUILayout.MaxWidth(40));
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Max In Stack", GUILayout.MaxWidth(80));
data._maxInStack = EditorGUILayout.IntField(data._maxInStack, GUILayout.MaxWidth(40));
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Is Eatable", GUILayout.MaxWidth(80));
data._isEatable = EditorGUILayout.Toggle(data._isEatable, GUILayout.MaxWidth(40));
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal();
if (data._isEatable)
{
EditorGUILayout.LabelField("Calories", GUILayout.MaxWidth(80));
data._calories = EditorGUILayout.IntField(data._calories, GUILayout.MaxWidth(40));
EditorGUILayout.LabelField("Water", GUILayout.MaxWidth(80));
data._water = EditorGUILayout.IntField(data._water, GUILayout.MaxWidth(40));
}
EditorGUILayout.EndHorizontal();
if (EditorGUI.EndChangeCheck())
{
EditorUtility.SetDirty(target);
AssetDatabase.SaveAssetIfDirty(target);
serializedObject.Update();
serializedObject.ApplyModifiedProperties();
}
}
}
}