zoukankan      html  css  js  c++  java
  • 编辑器插件数据保存之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

  • 相关阅读:
    BSGS模板(互质与不互质) 洛谷P4195、P3846
    整除分块(数论分块)
    洛谷P3327 [SDOI2015]约数个数和——莫比乌斯反演
    模块二
    模块
    二分法 匿名函数
    3.26作业
    函数的递归调用
    yield表达式 三元表达式
    3.25作业
  • 原文地址:https://www.cnblogs.com/zhaoqingqing/p/5269052.html
Copyright © 2011-2022 走看看