Unity3D данные ScriptableObject изменяются, но не пишутся в файл
В MonoBehaviour классе задана ссылка на ScriptableObject.
В режиме редактирования при помощи GUILayout.Button задаются его данные.
Сохраняем. Данные, вроде, сохранены. Даже выбранный ScriptableObject в инспекторе отображает данные. Но содержащий ScriptableObject файл на диске пустой.
Любой MonoBehaviour, кроме того, что редактировал данные того же ScriptableObject-а видит данные пустыми.
public TextAsset text;
[SerializeField]
// Ссылка на **ScriptableObject**
public PathFramesList pathFramesList;
[SerializeField]
// Данные, которые собираюсь сохранить
public List<List<ICurveData>> frameDatasList = new List<List<ICurveData>>();
// Метод вызван кнопкой в **CustomEditor**
public void ReadData()
{
#region генерируем данные
var separator = new string[] { "%" };
var framesUnparsedData = text.text.Split(separator, StringSplitOptions.None);
foreach (var f in framesUnparsedData)
frameDatasList.Add(ParseFrame(f));
var result = new ICurveData[frameDatasList.Count][];
for (int i = 0; i < frameDatasList.Count; i++)
result[i] = frameDatasList[i].ToArray();
#endregion
#region пытаемся сохранить
pathFramesList.frameDatasList = result;
EditorUtility.SetDirty(pathFramesList); // Even This didn't help
AssetDatabase.SaveAssets(); // Looks it doesn't work
AssetDatabase.Refresh(); // Hoped this will help, whatever it do
#endregion
}
Вот, собственно, ScriptableObjectClass И его CustomEditor
[CreateAssetMenu(fileName = "ParsedPathData", menuName = "Create Path Data Asset")]
[System.Serializable]
public class PathFramesList : ScriptableObject
{
[SerializeField]
// Массив Массивов экземпляров классов
// реализующих интерфейс **ICurveData**
public ICurveData[][] frameDatasList;
}
#if UNITY_EDITOR
[CustomEditor(typeof(PathFramesList))]
public class PathFramesListEditor : Editor
{
public override void OnInspectorGUI()
{
DrawDefaultInspector();
PathFramesList pathFrameList = (PathFramesList)target;
if(pathFrameList.frameDatasList == null)
{
GUILayout.TextField("Frames Count is 0");
}
else
{
// Эти Данные отображаются в дебаггере и в инспекторе
GUILayout.TextField("Frames Count is " + pathFrameList.frameDatasList.Length, 200);
}
if(GUILayout.Button("SaveAsset"))
{
// Акт отчаяния. Надеялся, что поможет
EditorUtility.SetDirty(target);
EditorUtility.SetDirty(serializedObject.targetObject);
serializedObject.Update();
serializedObject.ApplyModifiedProperties();
AssetDatabase.SaveAssets();
}
}
}
#endif