ScriptableObject的用法

ScriptableObject允许你存储大量用于公用的数据,可以理解成是Uinty的一个串行化工具,但要和SerializableObject区分开来(只能在Editor下使用)。例如,一个游戏中的配置表数据,这些数据一般都是由策划在Excel等工具上配置,要运用到游戏中时,一般都需要做一个转换,以适应程序中的访问。这时可以使用ScriptableObject,将数据预先处理成我们需要访问的数据结构,存储在ScriptableObject中,然后打包成一个外部文件,这样在游戏运行的时候就不用做解析和组装了。这个功能对大批量的公用数据尤其有用!! 
       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;
}
2、上面的是要打包的数据结构,在打包前可以先将数据填充,DesignerData里面应该有一个初始化数据的方法。如下图 

复制代码
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);
}
3打包数据(需要Unity Pro版) 

复制代码
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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值