编辑器插件数据保存之Serializable
Editor数据保存需求
做编辑器插件开发时,当打开一个窗口,对数值进行修改后,在关闭窗口或重新打开Unity时,希望能保存上次的数据。
相关知识
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的文件,这个文件保存着序列化的数据