Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据
Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据
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);
}
}
效果:
方式二:右键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();
}
}
效果:
创建后我们就可以在Inspector面板中在为该asset添加数据
使用ScirptableObject存储的数据
直接在使用的类中声明需要的ScriptableObject类型即可。然后就可以将之前创建好的asset资源添加到上面,我们就可以使用该方式存储的数据了。
Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据的更多相关文章
- unity 编辑器扩展简单入门
unity 编辑器扩展简单入门 通过使用编辑器扩展,我们可以对一些机械的操作实现自动化,而不用使用额外的环境,将工具与开发环境融为一体:并且,编辑器扩展也提供GUI库,来实现可视化操作:编辑器扩展甚至 ...
- Unity编辑器扩展chapter1
Unity编辑器扩展chapter1 unity通过提供EditorScript API 的方式为我们提供了方便强大的编辑器扩展途径.学好这一部分可以使我们学会编写一些工具来提高效率,甚至可以自制一些 ...
- 手把手教你开发Chrome扩展三:关于本地存储数据
手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 HTML5 ...
- Unity编辑器扩展Texture显示选择框
学习NGUI插件的时候,突然间有一个问题为什么它这些属性可以通过弹出窗口来选中呢? 而我自己写的组件只能使用手动拖放的方式=.=. Unity开发了组件Inspector视图扩展API,如果我们要写插 ...
- Unity 编辑器扩展
自定义检视面板的使用: 先是定义一个脚本文件,我们来修饰它的检视面板: [HelpURL("http://www.baidu.com")] public class Atr : M ...
- Unity 编辑器扩展 场景视图内控制对象
http://blog.csdn.net/akof1314/article/details/38129031 假设有一个敌人生成器类,其中有个属性range用来表示敌人生成的范围区域大小,那么可以用O ...
- Unity编辑器扩展
在开发中有可能需要自己开发编辑器工具,在Unity中界面扩展常见两种情况,拿某插件为例: 1,自建窗口扩展 2,脚本Inspector显示扩展 不管使用那种样式,都需要经常用到两个类EditorGUI ...
- Unity 编辑器扩展 Chapter2—Gizmos
二. 使用Gizoms绘制网格及矩阵转换使用 1. 创建Leve类,作为场景控制类: using UnityEngine; //使用namespace方便脚本管理 namespace RunAndJu ...
- unity编辑器扩展学习
扩展编辑器实际上就是在unity菜单栏中添加一些按钮,可以一键执行一些重复性的工作. 一.添加按钮 1.简单使用MenuItem特性 using UnityEngine; using UnityEdi ...
随机推荐
- 以太坊系列之一: 以太坊RLP用法-以太坊源码学习
RLP (递归长度前缀)提供了一种适用于任意二进制数据数组的编码,RLP已经成为以太坊中对对象进行序列化的主要编码方式.RLP的唯一目标就是解决结构体的编码问题:对原子数据类型(比如,字符串,整数型, ...
- Maven实战系列文章目录
Maven实战(一)安装与配置 Maven实战(二)构建简单Maven项目 Maven实战(三)Eclipse构建Maven项目 Maven实战(四)生命周期 Maven实战(五)坐标详解 Maven ...
- 【转载】Java 集合框架
http://wangkuiwu.github.io/2012/02/03/collection-03-arraylist/ 网上比较全的Java集合框架教程. 注:transient是Java语言的 ...
- jQuery 3D圆盘旋转焦点图 支持鼠标滚轮
之前我们分享过很多炫酷实用的jQuery焦点图插件了,今天介绍的这款jQuery焦点图非常特别,所有图片围成一个圆圈,组成一个立体视觉的圆盘,并且可以旋转选择圆盘中的图片.另外,这款jQuery 3D ...
- 一些需要禁用的PHP危险函数
phpinfo()功能描述:输出 PHP 环境信息以及相关的模块.WEB 环境等信息.危险等级:中 passthru()功能描述:允许执行一个外部程序并回显输出,类似于 exec().危险等级:高 e ...
- Codeforces 1118 F2. Tree Cutting (Hard Version) 优先队列+树形dp
题目要求将树分为k个部分,并且每种颜色恰好在同一个部分内,问有多少种方案. 第一步显然我们需要知道哪些点一定是要在一个部分内的,也就是说要求每一个最小的将所有颜色i的点连通的子树. 这一步我们可以将所 ...
- P1880 [NOI1995]石子合并
题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...
- kubernetes 网络模型
在Kubernetes模型中,每个Docker主机的docker0网桥都是可以路由的. 那就是说,当一个Pod部署后,集群其他主机能够不在物理主机上做端口映射就可以直接访问Pod. 有了这种说法,从网 ...
- kotlin使用anko在Android中实现Activity跳转,超优雅!
//正常跳转 startActivity<RegisterActivity>() //携带参数 startActivity<ResetPwdActivity>("ke ...
- Android 使用系统自带分享功能
way1: Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain");// setT ...