ScriptableObject允许你存储大量用于公用的数据,可以理解成是Uinty的一个串行化工具,但要和SerializableObject区分开来(只能在Editor下使用)。例如,一个游戏中的配置表数据,这些数据一般都是由策划在Excel等工具上配置,要运用到游戏中时,一般都需要做一个转换,以适应程序中的访问。这时可以使用ScriptableObject,将数据预先处理成我们需要访问的数据结构,存储在ScriptableObject中,然后打包成一个外部文件,这样在游戏运行的时候就不用做解析和组装了。这个功能对大批量的公用数据尤其有用!!
ScriptableObject支持所有原子的类型,也支持strings,arrays,lists还有Unity的Vector3等都支持,而且还支持自定义的类,但需要有一个串行的属性。举个例子:
1、定义一个要打包的类,这个类必须要继承自ScriptableObject:
复制代码
2、上面的是要打包的数据结构,在打包前可以先将数据填充,DesignerData里面应该有一个初始化数据的方法。如下图
复制代码
3打包数据(需要Unity Pro版)
复制代码
个人粗略见解,勿喷!
代码在这里 ScriptableObject用法.unitypackage
ScriptableObject支持所有原子的类型,也支持strings,arrays,lists还有Unity的Vector3等都支持,而且还支持自定义的类,但需要有一个串行的属性。举个例子:
1、定义一个要打包的类,这个类必须要继承自ScriptableObject:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
// DesignerData必须继承自ScriptableObject
public
class
DesignerData : ScriptableObject {
// 这个属性的必须的,因为DesignerData类中的data是SubClass类型
// 必须序列化后才能打包
[System.Serializable]
public
class
SubClass {
[System.Serializable]
// 这个属性的必须的,解析同上
public
class
Item
{
public
string
c;
public
float
d;
}
public
Item item;
public
int
a;
}
public
List<
int
> lst1;
public
List<SubClass> lst2;
public
SubClass data;
public
Vector3 vec;
}
|
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
public
void
init()
{
// 初始化lst1
lst1 =
new
List<
int
>();
lst1.Add(1);
lst1.Add(2);
lst1.Add(3);
// 初始化data
data =
new
SubClass();
data.a = 101;
data.item =
new
SubClass.Item();
data.item.c =
"world"
;
data.item.d = 99;
// 初始化lst2
lst2 =
new
List<SubClass>();
data =
new
SubClass();
data.a = 1012;
data.item =
new
SubClass.Item();
data.item.c =
"world2"
;
data.item.d = 992f;
lst2.Add(data);
data =
new
SubClass();
data.a = 1011;
data.item =
new
SubClass.Item();
data.item.c =
"world1"
;
data.item.d = 991f;
lst2.Add(data);
// 初始化vec
vec =
new
Vector3(1f, 2f, 3f);
}
|
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
[MenuItem(
"example/load/ScriptableObjectTest/pack Asset Data"
)]
private
static
void
exportDesignerAssetData()
{
string
path =
"Assets/load/ScriptableObjectTest"
;
string
name =
"DesignerData"
;
DirectoryInfo dirInfo =
new
DirectoryInfo(path);
if
(!dirInfo.Exists)
{
Debug.LogError(
string
.Format(
"can found path={0}"
, path));
return
;
}
// ScriptableObject对象要用ScriptableObject.CreateInstance创建
DesignerData ddata = ScriptableObject.CreateInstance<DesignerData>();
ddata.init();
// 创建一个asset文件
string
assetPath =
string
.Format(
"{0}/{1}.asset"
, path, name);
AssetDatabase.CreateAsset(ddata, assetPath);
// 创建一个assetbundle文件
string
assetbundlePath =
string
.Format(
"{0}/{1}.assetbundle"
, path, name);
BuildPipeline.BuildAssetBundle(ddata,
null
, assetbundlePath);
Debug.Log(
"Finish!"
);
}
|
代码在这里 ScriptableObject用法.unitypackage