- Home /
Edit and persist serializable Assets in the Editor Window
I have an asset saved in my project which represents a serializable scriptable object (Which is actually a list of base elements).
There is no problem changing values for this object in the inspector, and the changes do persist and survive assembly reloads and exiting/entering unity.
I am trying to mimic the inspector behavior in an Editor Window.
But any changes I do in the Editor Window, though reflected in the Inspector, do not persist.
I am guessing I am loading the asset wrongly in the Editor Window, the asset is loaded in the OnSelectionChange() callback when an asset of the right type is selected.
Any help/ideas would be appreciated.
public class DmgTypeListEditor : EditorWindow
{
private DmgTypesList m_DmgTypesContainer;
[MenuItem("GameAssets/DmgTypeEditor")]
static void Init()
{
GetWindow<DmgTypeListEditor>();
}
void OnGUI()
{
if (m_DmgTypesContainer == null) return;
if (m_DmgTypesContainer.m_dmgTypeList != null)
{
foreach (var item in m_DmgTypesContainer.m_dmgTypeList)
{
EditorGUILayout.LabelField(item.dmgType.ToString());
item._defaultDmgValue = EditorGUILayout.IntField(item._defaultDmgValue);
item._attackerDescription = EditorGUILayout.TextField(item._attackerDescription);
}
}
}
void OnSelectionChange()
{
//Check to see if a database of this type was selected:
Object selectedObject = Selection.activeObject;
if (selectedObject != null)
{
if (selectedObject.GetType() == typeof(DmgTypesList))
{
Debug.Log("Selected object is of the right type");
m_DmgTypesContainer = Selection.activeObject as DmgTypesList;
}
else
{
Debug.Log("Selected object is NOT of the right type");
}
}
}
}
Answer by Nims · Apr 07, 2014 at 08:28 AM
Well after searching and testing I found out that in order to save any changes to the scriptable object in the editor window, I need to do 2 things:
Detect any relevant changes made to the scriptable object in the editor window using the GUI.changed boolean.
Apply those changes with EditorUtility.SetDirty(MyScriptabelObject);
So all I had to do is change my OnGUI() to the following:
if (m_DmgTypesContainer.m_dmgTypeList != null)
{
GUI.changed = false;
foreach (var item in m_DmgTypesContainer.m_dmgTypeList)
{
EditorGUILayout.LabelField(item.dmgType.ToString());
item._defaultDmgValue = EditorGUILayout.IntField(item._defaultDmgValue);
item._attackerDescription = EditorGUILayout.TextField(item._attackerDescription);
EditorGUILayout.Space();
}
if (GUI.changed)
{
//Debug.Log("GUI.changed");
EditorUtility.SetDirty(m_DmgTypesContainer);
}
}
Your answer
Follow this Question
Related Questions
Serializing a Transform instance in a custom inspector window 2 Answers
EditorUtiltiy.GetAssetPreview(Object asset) 0 Answers
Refresh single asset 1 Answer
ScriptableObject does not serialize 0 Answers