ScriptableObject
什么是ScriptableObject?
直译过来就是“脚本化对象”,换言之这类作为存储结构化的数据来使用,并写入Unity的资源.asset文件去存储一组数据,取用的时候直接作为一个数据对象拿来用,很方便。
ScriptableObject 有什么好处?
- Unity用于创建不需要绑定到物体的对象,即非继承于Mono,该类继承于UnityEngine.Object
- 存放编辑器或数据配置文件
- 方便操作管理,可以可视化编辑
- 取数据方便,ScriptableObject已经是可序列化的数据,不用像读取纯文本或xml那样还要繁琐耗时的数据解析过程
不过根据近期使用发现它也有一些不足
- 虽然编辑可视化,但受限于数据量,存放的数据太多的时候,阅读就不直观了,如图数据多了想编辑需要一项项展开,查找也不方便,
针对ScriptableObject的内容多时编辑不直观的情况,最好是数据源头管理出发修编辑修改数据,如数据来源于管理器创建、.txt、数据库、Excel表等等,最好直接去修改原数据。 我尝试了写一个GUI数据编辑器,结果就是更恶心更不直观。
ScriptableObject怎么用?
对象创建
如下是我声明的一个继承自 ScriptableObject 的类 MyScriptableObject,其中我还想序列化一些自定义的数据结构
using System.Collections.Generic;
public class MyScriptableObject : UnityEngine.ScriptableObject
{
public string testName = "";
//注意:基本数据类型以外的成员类型需要加 SerializeField 关键字
[UnityEngine.SerializeField]
public List<MyDataInfo> myData = new List<MyDataInfo>();
}
//注意:自定义数据类型被ScriptableObject对象使用的时候,该类需要加 Serializable 关键字
[System.Serializable]
public class MyDataInfo
{
public int dataNumber = 0;
public string dataStr = "";
public MyDataInfo(int dataNumber,string dataStr)
{
this.dataNumber = dataNumber;
this.dataStr = dataStr;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
那么问题来了,怎么编辑使用这个类呢?你可以把它当做一个普通的Object子对象去使用,也可以实例出来并存放到.asset文件中去作为一个数据体,如下创建asset文件
MyScriptableObject nameInfoObj = ScriptableObject.CreateInstance<MyScriptableObject>();
nameInfoObj.testName = "测试名字";
nameInfoObj.name = "MyScriptableObject";
nameInfoObj.myData.Add(new MyDataInfo(100, "myData测试"));
nameInfoObj.myData.Add(new MyDataInfo(101, "myData3测试"));
UnityEditor.AssetDatabase.CreateAsset(nameInfoObj, "Assets/" + nameInfoObj.name + ".asset");
- 1
- 2
- 3
- 4
- 5
- 6
对象加载使用
- 直接加载 ScriptableObject 对象,其中具体的“ScriptableObject”可以是继承自ScriptableObject的实际对象类型,我之所以这么写是因为这样写相对保险:
string path = Application.dataPath+"/aaaaa.asset";
UnityEngine.Object[] loadList = AssetDatabase.LoadAllAssetsAtPath(path);
if(loadList[0] == null)
{
//TOOD这里考虑路径有效的情况下,但拿到的asset内容资源无效,丢失了绑定的脚本
}
ScriptableObject dataInfo = loadList[0] as ScriptableObject;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
不然如果读同样的文件内容以下方式,就有可能报错了,如我换用以下这两种写法,Unity就回抛出一个警告,因此不提倡以下的写法
ScriptableObject dataInfo = AssetDatabase.LoadAssetAtPath<ScriptableObject>(assetPath);
ScriptableObject dataInfo = AssetDatabase.LoadAssetAtPath(assetPath, typeof(ScriptableObject)) as ScriptableObject;
- 1
- 2
- 3
警告:
Invalid AssetDatabase path: E:/MyTest/Assets/aaaaa.asset. Use path relative to the project folder.
- 通过AssetBundle加载使用,假定已经拿到了AssetBundle资源res的情况下:
AssetBundle res;
ScriptableObject obj = res.LoadAllAssets()[0] as ScriptableObject;
//TODO取用obj继续操作
- 1
- 2
但是这么写也有不保险的时候,因为在Unity中 .asset 和 ScriptableObject 类是两个独立的文件,万一我拿到的是“脏AB”,拿到了非空的AssetBundle,但里面关联的ScriptableObject已经被删除或丢失了怎么办?这个时候还要判断该AB 的有效性:
简单的做法是
if (res.LoadAllAssets().Length == 0)
{
//TODO res中ScriptableObject引用丢失,该资源异常
}
- 1
- 2
- 3
- 4
否则如果不判断的话,即使拿到了AB也没法继续有效的处理,Unity还是会抛出警告的
最后:附上我在GitHub上传的简单序列化对象的用法,约定了序列化对象的定义,创建及加载。:)
点击这里
ScriptableObject的更多相关文章
- ScriptableObject本地序列化后重启Unity后报The associated script can not be loaded.Please fix any compile errors and assign a valid script的坑
踩坑 做编辑器一些设置序列化存在本地的时候,继承自ScriptableObject的类通过 创建的asset文件. 在重启Unity后查看这个asset发现上面的所有序列化属性丢失,报的错就是 在不存 ...
- unity, 由scriptableObject创建.asset
由继承自scriptableObject的类X创建.asset文件. 假设类X的定义为: [System.Serializable] public class X : ScriptableObject ...
- [cb]ScriptableObject 序列化
ScriptableObject ScriptableObject是一个类,它允许你存储大量用于共享的数据独立脚本实例,不要迷惑这个类同样可以叫做 SerializableObject,可以理解成是一 ...
- Unity ScriptableObject的使用
ScriptableObject主要实现对象序列化的保存,因为是Unity自己的序列化,所以比xml,json序列化方便很多,但相对可控性也比较差 1.Editor下写入和读取测试: using Un ...
- EditorWindow edit ScriptableObject
using UnityEngine; [System.Serializable] public class Weapon { //[SerializeField] public string weap ...
- Unity3D之ScriptableObject学习笔记
不同与C#提供的Serializable序列化功能,ScriptableObject是Unity3D提供的一个数据存储类,我们接下来学习一下这个类的功能. 官方文档 http://docs.unity ...
- 自定义ScriptableObject属性显示
自定义ScriptableObject属性显示的三种方式 1. 继承Editor,重写OnInspectorGUI方法 Editor官方文档 需求 将TestClass中intData属性和strin ...
- unity中ScriptableObject在assetbundle中的加载
转载请标明出处:http://www.cnblogs.com/zblade/ 以前都是写一些个人的调研博客,从今天开始,也写一些个人在开发中遇到的一些可以分享的趟坑博客,为后续的开发人员提供一些绵薄之 ...
- Unity3D|-使用ScriptableObject脚本化对象来制作一个简单的对象池
ScriptableObject是一个用于生成单独Asset的结构.同时,它也能被称为是Unity中用于处理序列化的结构. 可以作为我们存储资源数据的有效方案.同时此资源可以作为我们AB包的有效资源! ...
- 使用ScriptableObject创建.asset文件
.asset一般用来存储一些配置,比如SDK初始化的相关参数. using System.Collections.Generic; using UnityEngine; namespace XXX { ...
随机推荐
- 蓝桥杯 算法训练 ALGO-124 数字三角形
算法训练 数字三角形 时间限制:1.0s 内存限制:256.0MB 问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和 ...
- 机器学习:逻辑回归(OvR 与 OvO)
一.基础理解 问题:逻辑回归算法是用回归的方式解决分类的问题,而且只可以解决二分类问题: 方案:可以通过改造,使得逻辑回归算法可以解决多分类问题: 改造方法: OvR(One vs Rest),一对剩 ...
- 人脑和CPU
人类的数学运算没有计算机快是因为神经信号速度没有电信号快吗,电信号是光速吧. 不过人类的cpu大脑和存储硬盘和内存超过目前计算机n条街,虽然传输速度慢,但是传输量也是大的,其实计算机就是根据人脑设计的 ...
- python学习笔记(二):python数据类型
上一篇博客写了python的入门和简单流程控制,这次写python的数据类型和各种数据类型的内置方法.一.数据类型是什么鬼?计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各 ...
- PD中更改显示Name还是Code的设置
菜单->Tool->Model Options->Name Convention->右侧display中选择显示name还是code. 此外,在16版中,还可以通过Tool-D ...
- 类型:Java;问题:eclipse配置maven;结果:eclipse配置maven
eclipse配置maven 下面跟大家分享的是eclipse配置maven的方法. 方法/步骤 安装maven之前,要先安装jdk及配置JAVA_HOME环境变量.JDK1.4以上. 下载maven ...
- MXF文件结构浅析
MXF是英文Material eXchange Format(素材交换格式)的缩语.MXF是SMPTE(美国电影与电视工程师学会)组织定义的一种专业音视频媒体文件格式.MXF主要应用于影视行业媒体制作 ...
- java之类的封装
类和对象成员变量,成员函数特殊的成员变量和成员函数 函数重载 构造函数 静态变量 静态函数面向对象:封装 继承 多态封装 Encapsulation为什么需要封装?外界无法直接操作对象的具体的属性(安 ...
- CUDA编程接口:异步并发执行的概念和API
1.主机和设备间异步执行 为了易于使用主机和设备间的异步执行,一些函数是异步的:在设备完全完成任务前,控制已经返回给主机线程了.它们是: 内核发射; 设备间数据拷贝函数; 主机和设备内拷贝小于64KB ...
- eclipse 中文版 变成 英文版 方法
找到目录运行命令 “eclipse.exe -nl en”