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. 以太坊系列之一: 以太坊RLP用法-以太坊源码学习

    RLP (递归长度前缀)提供了一种适用于任意二进制数据数组的编码,RLP已经成为以太坊中对对象进行序列化的主要编码方式.RLP的唯一目标就是解决结构体的编码问题:对原子数据类型(比如,字符串,整数型, ...

  2. Maven实战系列文章目录

    Maven实战(一)安装与配置 Maven实战(二)构建简单Maven项目 Maven实战(三)Eclipse构建Maven项目 Maven实战(四)生命周期 Maven实战(五)坐标详解 Maven ...

  3. 【转载】Java 集合框架

    http://wangkuiwu.github.io/2012/02/03/collection-03-arraylist/ 网上比较全的Java集合框架教程. 注:transient是Java语言的 ...

  4. jQuery 3D圆盘旋转焦点图 支持鼠标滚轮

    之前我们分享过很多炫酷实用的jQuery焦点图插件了,今天介绍的这款jQuery焦点图非常特别,所有图片围成一个圆圈,组成一个立体视觉的圆盘,并且可以旋转选择圆盘中的图片.另外,这款jQuery 3D ...

  5. 一些需要禁用的PHP危险函数

    phpinfo()功能描述:输出 PHP 环境信息以及相关的模块.WEB 环境等信息.危险等级:中 passthru()功能描述:允许执行一个外部程序并回显输出,类似于 exec().危险等级:高 e ...

  6. Codeforces 1118 F2. Tree Cutting (Hard Version) 优先队列+树形dp

    题目要求将树分为k个部分,并且每种颜色恰好在同一个部分内,问有多少种方案. 第一步显然我们需要知道哪些点一定是要在一个部分内的,也就是说要求每一个最小的将所有颜色i的点连通的子树. 这一步我们可以将所 ...

  7. P1880 [NOI1995]石子合并

    题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...

  8. kubernetes 网络模型

    在Kubernetes模型中,每个Docker主机的docker0网桥都是可以路由的. 那就是说,当一个Pod部署后,集群其他主机能够不在物理主机上做端口映射就可以直接访问Pod. 有了这种说法,从网 ...

  9. kotlin使用anko在Android中实现Activity跳转,超优雅!

    //正常跳转 startActivity<RegisterActivity>() //携带参数 startActivity<ResetPwdActivity>("ke ...

  10. Android 使用系统自带分享功能

    way1: Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain");// setT ...