Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据

unity unity Editor ScirptableObject 

Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据

OverView

API

ScriptableObject是unity中的一种特别的类型,它不需要挂在场景中的对象上。它可以视作asset资源一样,存储在项目文件中。在一些特殊的情况下要比JSON,XML及TXT方式来存储持久化数据要受益得多。因为unity可以自主序列化和解析该类型,而不需要像其他方式一样需要第三方工具或自己编写解析工具。

注意:它仍然有Awake,OnEnable,OnDestory等方法可以供你使用,详见上方API

创建一个ScriptableObject

需要创建一个ScriptableObject只需要让一个类继承ScriptableObject即可。

using UnityEngine;
using System;
namespace MyScirptableObject {
[Serializable]
public class LevelSettings : ScriptableObject {
public float gravity = -30;
public AudioClip bgm;
public Sprite background;
}
}

创建一个包含该数据类的asset资源

可以通过多种方式来创建该资源,主要使用 ScriptableObject.CreateInstance 方法

方式一:使用tool菜单创建

注意:在使用Editor类中添加如下方法

public static T CreateAsset<T>(string path)
where T : ScriptableObject {
T dataClass = (T) ScriptableObject.CreateInstance<T>();
AssetDatabase.CreateAsset(dataClass, path);
AssetDatabase.Refresh();
AssetDatabase.SaveAssets();
return dataClass;
} [MenuItem ("Tools/Level Creator/New Level Settings")]
private static void NewLevelSettings () {
string path = EditorUtility.SaveFilePanelInProject(
"New Level Settings",
"LevelSettings",
"asset",
"Define the name for the LevelSettings asset");
if(path != "") {
EditorUtils.CreateAsset<LevelSettings>(path);
}
}

效果:

Menu

方式二:右键Project面板使用Create菜单创建

using UnityEngine;
using UnityEngine.Events; [CreateAssetMenu(menuName= "CreateMyScriptableScript",fileName= "Scripts/MyScriptableScript")]
public class MyScriptableScript : ScriptableObject
{
public string Name;
public int Level;
public GameObject Prefab;
public UnityEvent Event; public void Instance()
{
GameObject go = GameObject.Instantiate(Prefab);
go.name = Name;
Event.AddListener(() =>
{
Debug.Log(("call event!"));
foreach (var renderer in go.transform.GetChild(0).GetComponentsInChildren<Renderer>())
{
renderer.material.color = Color.red;
} });
Event.Invoke();
} }

效果:

Create

创建后我们就可以在Inspector面板中在为该asset添加数据

DataAsset

使用ScirptableObject存储的数据

直接在使用的类中声明需要的ScriptableObject类型即可。然后就可以将之前创建好的asset资源添加到上面,我们就可以使用该方式存储的数据了。

Use

Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据的更多相关文章

  1. unity 编辑器扩展简单入门

    unity 编辑器扩展简单入门 通过使用编辑器扩展,我们可以对一些机械的操作实现自动化,而不用使用额外的环境,将工具与开发环境融为一体:并且,编辑器扩展也提供GUI库,来实现可视化操作:编辑器扩展甚至 ...

  2. Unity编辑器扩展chapter1

    Unity编辑器扩展chapter1 unity通过提供EditorScript API 的方式为我们提供了方便强大的编辑器扩展途径.学好这一部分可以使我们学会编写一些工具来提高效率,甚至可以自制一些 ...

  3. 手把手教你开发Chrome扩展三:关于本地存储数据

    手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 HTML5 ...

  4. Unity编辑器扩展Texture显示选择框

    学习NGUI插件的时候,突然间有一个问题为什么它这些属性可以通过弹出窗口来选中呢? 而我自己写的组件只能使用手动拖放的方式=.=. Unity开发了组件Inspector视图扩展API,如果我们要写插 ...

  5. Unity 编辑器扩展

    自定义检视面板的使用: 先是定义一个脚本文件,我们来修饰它的检视面板: [HelpURL("http://www.baidu.com")] public class Atr : M ...

  6. Unity 编辑器扩展 场景视图内控制对象

    http://blog.csdn.net/akof1314/article/details/38129031 假设有一个敌人生成器类,其中有个属性range用来表示敌人生成的范围区域大小,那么可以用O ...

  7. Unity编辑器扩展

    在开发中有可能需要自己开发编辑器工具,在Unity中界面扩展常见两种情况,拿某插件为例: 1,自建窗口扩展 2,脚本Inspector显示扩展 不管使用那种样式,都需要经常用到两个类EditorGUI ...

  8. Unity 编辑器扩展 Chapter2—Gizmos

    二. 使用Gizoms绘制网格及矩阵转换使用 1. 创建Leve类,作为场景控制类: using UnityEngine; //使用namespace方便脚本管理 namespace RunAndJu ...

  9. unity编辑器扩展学习

    扩展编辑器实际上就是在unity菜单栏中添加一些按钮,可以一键执行一些重复性的工作. 一.添加按钮 1.简单使用MenuItem特性 using UnityEngine; using UnityEdi ...

随机推荐

  1. ajax 跨域解决方法

    最近在开发过程中,使用ajax去异步调取图片.在开发中这个功能没什么问题,可以后来提测,重新部署之后就有问题了,这就是ajax的跨域问题. ajax核心对象XMLHttpRequest本身是不支持跨域 ...

  2. 使用MS的ScriptDom来拆解TSQL脚本

    此处提供9.1.40413.0版本的DLL一共4个:Microsoft.Data.Schema.dll.Microsoft.Data.Schema.ScriptDom.dll.Microsoft.Da ...

  3. 自定义控件(视图)2期笔记14:自定义视图之View事件分发 dispatchTouchEvent,onTouch,onTouchEvent,onClick逻辑顺序过程

    1. 这里我们先从案例角度说明dispatchTouchEvent,onTouch,onTouchEvent,onClick逻辑顺序过程: (1)首先我们重写一个MyButton 继承自 Button ...

  4. Java多线程和并发基础面试总结

    多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题.收藏起来,希望给予即将找 ...

  5. Day15 集合(二)

    Set简介 定义 public interface Set<E> extends Collection<E> {} Set是一个继承于Collection的接口,即Set也是集 ...

  6. Algorithms: Design and Analysis, Part 1 - Problem Set 1 - Question 5

    最后一个图像,用画图软件绘制了一下,自己的直接主观判断还是有些小问题的 注意:最后的灰色的线条会超过橙色的线条

  7. P1070 道路游戏

    题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有 n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依次将这 n 个机器人工厂编 ...

  8. HDU 2298(纯物理加解一元二次方程)

    Toxophily Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  9. C++网络爬虫的实现——WinSock编程

    写了一个网络爬虫,可以抓取网上的图片. 需要给定初始网站即可. 在vs2010中编译通过. 需要使用多字节字符集进行编译, vs2010默认的是Unicode字符集. 编译后,运行即可,有惊喜哦!!! ...

  10. 12 Bit ADC与LSB的含义

    [转]12 Bit ADC与LSB的含义 LSB(Least Significant Bit),意为最低有效位:MSB(Most Significant Bit),意为最高有效位,若MSB=1,则表示 ...