Uinty ScriptableObject的用法

来源:互联网 发布:保护隐私的软件 编辑:程序博客网 时间:2024/05/22 02:14

ScriptableObject允许你存储大量用于公用的数据,可以理解成是Uinty的一个串行化工具,但要和SerializableObject区分开来(只能在Editor下使用)。例如,一个游戏中的配置表数据,这些数据一般都是由策划在Excel等工具上配置,要运用到游戏中时,一般都需要做一个转换,以适应程序中的访问。这时可以使用ScriptableObject,将数据预先处理成我们需要访问的数据结构,存储在ScriptableObject中,然后打包成一个外部文件,这样在游戏运行的时候就不用做解析和组装了。这个功能对大批量的公用数据尤其有用!! 
       ScriptableObject支持所有原子的类型,也支持strings,arrays,lists还有Unity的Vector3等都支持,而且还支持自定义的类,但需要有一个串行的属性。举个例子: 
1、定义一个要打包的类,这个类必须要继承自ScriptableObject:


[csharp] view plain copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3. using System.Collections.Generic;  
  4. using UnityEditor;  
  5. using System.IO;  
  6.   
  7. public class DesignerData : ScriptableObject  {  
  8.   
  9.     // 这个属性的必须的,因为DesignerData类中的data是SubClass类型  
  10.     // 必须序列化后才能打包  
  11.     [System.Serializable]   
  12.     public class SubClass {  
  13.   
  14.         [System.Serializable] // 这个属性的必须的,解析同上  
  15.         public class Item  
  16.         {  
  17.             public string c;  
  18.             public float d;  
  19.         }  
  20.   
  21.         public Item item;  
  22.         public int a;  
  23.     }  
  24.   
  25.     public List<int> lst1;  
  26.     public List<SubClass> lst2;  
  27.     public SubClass data;   
  28.     public Vector3 vec;  
  29.   
  30.     public void init()  
  31.     {  
  32.         // 初始化lst1  
  33.         lst1 = new List<int>();  
  34.         lst1.Add(1);  
  35.         lst1.Add(2);  
  36.         lst1.Add(3);  
  37.   
  38.         // 初始化lst2  
  39.         lst2 = new List<SubClass>();  
  40.   
  41.         data = new SubClass();  
  42.         data.a = 101;  
  43.         data.item = new SubClass.Item();  
  44.         data.item.c = "world";  
  45.         data.item.d = 99;  
  46.         lst2.Add(data);  
  47.   
  48.         data = new SubClass();  
  49.         data.a = 102;  
  50.         data.item = new SubClass.Item();  
  51.         data.item.c = "world2";  
  52.         data.item.d = 992f;  
  53.         lst2.Add(data);  
  54.   
  55.         data = new SubClass();  
  56.         data.a = 103;  
  57.         data.item = new SubClass.Item();  
  58.         data.item.c = "world1";  
  59.         data.item.d = 991f;   
  60.         lst2.Add(data);  
  61.   
  62.         // 初始化vec  
  63.         vec = new Vector3(1f, 2f, 3f);  
  64.     }  
  65.   
  66.     [MenuItem("ScriptableObject/PackData")]  
  67.     private static void exportDesignerAssetData()  
  68.     {  
  69.         DirectoryInfo dirInfo = new DirectoryInfo(Path);  
  70.         if(!dirInfo.Exists)  
  71.         {  
  72.             Debug.LogError(string.Format("can found path={0}", Path));  
  73.             return;  
  74.         }  
  75.   
  76.         // ScriptableObject对象要用ScriptableObject.CreateInstance创建  
  77.         DesignerData ddata = ScriptableObject.CreateInstance<DesignerData>();  
  78.         ddata.init();  
  79.   
  80.         // 创建一个asset文件  
  81.         //***.asset既可以在运行时(runtime),也可以再编辑器环境下使用  
  82.         string assetPath = string.Format("{0}/{1}.asset", Path, name);  
  83.         AssetDatabase.CreateAsset(ddata, assetPath);  
  84.         AssetDatabase.Refresh();  
  85.   
  86.         //我们还可以创建资源包  
  87.         //***.unity3d只能在运行时(runtime)使用,并且只能通过WWW加载  
  88.         Object o = AssetDatabase.LoadAssetAtPath(assetPath, typeof(DesignerData));  
  89.         BuildPipeline.BuildAssetBundle(o, null"TestAssetBundle.unity3d");  
  90.         AssetDatabase.Refresh();  
  91.   
  92.         // ***.assetbundle文件只能通过WWW来加载  
  93.         string assetbundlePath = string.Format("{0}/{1}.assetbundle", Path, name);  
  94.         BuildPipeline.BuildAssetBundle(ddata, null, assetbundlePath);  
  95.   
  96.         Debug.Log("PackData, Finish!");  
  97.     }   
  98.   
  99.     private static string Path = "Assets/Resources/ScriptableObjectData";  
  100.     private static string name = "DesignerData";  
  101.   
  102.     public static void ReadAssetByResourcesLoad()  
  103.     {  
  104.         string path = "ScriptableObjectData/DesignerData";  
  105.         DesignerData o = Resources.Load (path, typeof(DesignerData)) as DesignerData;  
  106.         Debug.Log (o.data.item.c);  
  107.     }  
  108.   
  109.   
  110.   
  111. }  

原创粉丝点击