编辑器插件数据保存之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=; public void OnGUI()
{
m_Name = EditorGUILayout.TextField("Name", m_Name);
m_Value = EditorGUILayout.IntSlider("Value", m_Value, , );
}
}
要点
类继承自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的文件,这个文件保存着序列化的数据

编辑器插件数据保存之Serializable的更多相关文章
- WordPress插件制作教程(四): 将数据保存到数据库
上一篇讲解了添加菜单的方法,这一篇为大家讲解如何将数据保存到数据库中,并且显示在页面上,不会因提交表单时刷新页面输入框中内容消失.要实现这一功能我们需要借助WordPress函数来实现,下面就来讲解具 ...
- extjs_04_grid(弹出窗口&行编辑器 CRUD数据)
1.弹出窗口(添加.删除) watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWRhbV93enM=/font/5a6L5L2T/fontsize/400/f ...
- 百度umeditor富文本编辑器插件扩展
富文本编辑器在WEB开发中经常用到,个人比较喜欢用百度出的ueditor这款,ueditor这款本身支持插件扩展的,但是ueditor的mini版本 umeditor 就没有那么方便了,不过找了很多资 ...
- vue-quill-editor 富文本编辑器插件介绍
Iblog项目中博文的文本编辑器采用了vue-quill-editor插件,本文将简单介绍其使用方法. 引入配置 安装模块 npm install vue-quill-editor --save in ...
- Delphi:ClientDataset+TDataSetProvider的数据保存问题
看到一篇介绍ClientDataSet和TDataSetProvider,非常精彩,特此保存. ==================================================== ...
- jquery插件课程2 放大镜、多文件上传和在线编辑器插件如何使用
jquery插件课程2 放大镜.多文件上传和在线编辑器插件如何使用 一.总结 一句话总结:插件使用真的还是比较简单的,引包,初始化,配置参数(json),配置数据(json),而后两步不是必须的.而且 ...
- Python小数据保存,有多少中分类?不妨看看他们的类比与推荐方案...
小数据存储 我们在编写代码的时候,经常会涉及到数据存储的情况,如果是爬虫得到的大数据,我们会选择使用数据库,或者excel存储.但如果只是一些小数据,或者说关联性较强且存在存储后复用的数据,我们该如何 ...
- Hibernate数据保存操作方法的原理对比
Interface Session All Superinterfaces: Serializable All Known Subinterfaces: EventSource, Session Al ...
- java大并发数据保存方案
做了几年.net,如今终于要做java了. 需求: 线下终端会定时上传gps位置到服务端,服务端收到数据保存到mysql数据库,当线下终端过多时,问题出现了,首当其冲的是数据库连接池经常会崩溃,单个t ...
随机推荐
- JS常用的function集合
1.把字符串转为日期格式 (1) var str ='2012-08-12 23:13:15';str = str.replace(/-/g,"/");var date = ne ...
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q36-Q39)
Question 36 You are designing a SharePoint 2010 application. You need to design the application so t ...
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q59-Q62)
Question 59You are designing a collection of Web Parts that will be packaged into a SharePoint 2010 ...
- NSURLSession从网络上下载资源,此程序下载的是视频
#import "ViewController.h" @interface ViewController ()<NSURLSessionDelegate, NSURLSess ...
- RxJava 和 RxAndroid 一 (基础)
1.RxJava 项目地址 https://github.com/ReactiveX/RxJava 2.RxAndroid 项目地址 https://github.com/ReactiveX/R ...
- spring.net (1) 概念-控制反转(又名依赖注入)
Spring.net 作为一个应用程序框架,在构建企业级.net应用程序提供了很多灵活而又丰富的功能(如:依赖注入,aop,数据访问抽象,asp.net 扩展). 控制反转: Inversion of ...
- 【代码笔记】iOS-看图听故事
一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> #import <AVFoundation/AVFo ...
- Xcode常见错误汇总
1.error: macro names must be identifiers YourProject_prefix.pch 原因: 因为你弄脏了预处理器宏,在它处于<Multiple Val ...
- WPF学习之路(十二)控件(Items控件)
ListBox 提供了一个选项列表,可以固定或者动态绑定 <StackPanel> <GroupBox Margin="> <GroupBox.Header& ...
- [css]我要用css画幅画(一)
几年前开始就一直想用css画幅画. 今天才真正开始, 从简单的开始. 作为一个工作压力那么大的程序员,我首先要画一个太阳. html如下: <!DOCTYPE html> <html ...