编辑器插件数据保存之Serializable

Editor数据保存需求

做编辑器插件开发时,当打开一个窗口,对数值进行修改后,在关闭窗口或重新打开Unity时,希望能保存上次的数据。

serialization

相关知识

Serialization ,ScriptableObject

NGUI保存数据的方法

查看了下NGUI是把数据存储在EditorPrefs中,具体源码在NGUISettings.cs中的Setxxx()和Getxxx()方法。

步骤

1、创建一个C#脚本SerializeMe.cs

这个脚本作为数据保存的基类

SerializeMe.cs

using UnityEditor;
using UnityEngine;


[System.Serializable]
public class SerializeMe : ScriptableObject
{
    [SerializeField]
    private string m_Name="test";
    [SerializeField]
    private int m_Value=5;

    public void OnGUI()
    {
        m_Name = EditorGUILayout.TextField("Name", m_Name);
        m_Value = EditorGUILayout.IntSlider("Value", m_Value, 0, 10);
    }
}

要点

类继承自ScriptableObject,并且标识为Serializable。

m_Name和m_Value 都加上了SerializeField,(数据需要保存)

MyWindow.cs

2、创建一个C#脚本 MyWindow.cs 放在Editor目录

这个脚本的主要功能就是打开一个窗口,在OnEnable时读取上存盘的文件,并显示在窗口中

using System.IO;
using UnityEngine;
using UnityEditor;

public class MyWindow : EditorWindow
{
    private string savePath = "Assets/Serialization_Test.asset";
    private SerializeMe m_SerialziedThing;

    [MenuItem("Window/Serialization Test")]
    static void Init()
    {
        var window=GetWindow(typeof(MyWindow));
        window.title = "Serialization Test";
        window.Show();
    }

    void OnEnable()
    {
        if (m_SerialziedThing == null)
        {
            m_SerialziedThing = ScriptableObject.CreateInstance<SerializeMe>();
        }

        if (File.Exists(savePath))
        {
            m_SerialziedThing = AssetDatabase.LoadAssetAtPath(savePath, typeof(Object)) as SerializeMe;
        }
        else
        {
            AssetDatabase.CreateAsset(m_SerialziedThing, savePath);
            AssetDatabase.SaveAssets();
        }
    }

    void OnGUI()
    {
        GUILayout.Label("Serialized Things", EditorStyles.boldLabel);
        EditorGUILayout.HelpBox("Serialized this  config save to \"Assets/Serialization_Test.asset\"",MessageType.Info);
        m_SerialziedThing.OnGUI();

        if (GUI.changed)
        {
            //存盘数据
            EditorUtility.SetDirty(m_SerialziedThing);
        }
    }
}

使用方法

点击 Window/Serialization Test  打开窗体,修改数值后 关闭窗体,并再次打开窗体或重开Unity,可以看到还保存着还是上次的值。

 

注意事项

此功能会在Assets目录下生成一个Serialization_Test.asset的文件,这个文件保存着序列化的数据

image

posted @ 2016-03-12 16:14  赵青青  阅读(1872)  评论(0编辑  收藏  举报