Uinty ScriptableObject的用法

 
  

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


using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using System.IO;

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 lst1;
	public List lst2;
	public SubClass data; 
	public Vector3 vec;

	public void init()
	{
		// 初始化lst1
		lst1 = new List();
		lst1.Add(1);
		lst1.Add(2);
		lst1.Add(3);

		// 初始化lst2
		lst2 = new List();

		data = new SubClass();
		data.a = 101;
		data.item = new SubClass.Item();
		data.item.c = "world";
		data.item.d = 99;
		lst2.Add(data);

		data = new SubClass();
		data.a = 102;
		data.item = new SubClass.Item();
		data.item.c = "world2";
		data.item.d = 992f;
		lst2.Add(data);

		data = new SubClass();
		data.a = 103;
		data.item = new SubClass.Item();
		data.item.c = "world1";
		data.item.d = 991f; 
		lst2.Add(data);

		// 初始化vec
		vec = new Vector3(1f, 2f, 3f);
	}

	[MenuItem("ScriptableObject/PackData")]
	private static void exportDesignerAssetData()
	{
		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();
		ddata.init();

		// 创建一个asset文件
		//***.asset既可以在运行时(runtime),也可以再编辑器环境下使用
		string assetPath = string.Format("{0}/{1}.asset", Path, name);
		AssetDatabase.CreateAsset(ddata, assetPath);
		AssetDatabase.Refresh();

		//我们还可以创建资源包
		//***.unity3d只能在运行时(runtime)使用,并且只能通过WWW加载
		Object o = AssetDatabase.LoadAssetAtPath(assetPath, typeof(DesignerData));
		BuildPipeline.BuildAssetBundle(o, null, "TestAssetBundle.unity3d");
		AssetDatabase.Refresh();

		// ***.assetbundle文件只能通过WWW来加载
		string assetbundlePath = string.Format("{0}/{1}.assetbundle", Path, name);
		BuildPipeline.BuildAssetBundle(ddata, null, assetbundlePath);

		Debug.Log("PackData, Finish!");
	} 

	private static string Path = "Assets/Resources/ScriptableObjectData";
	private static string name = "DesignerData";

	public static void ReadAssetByResourcesLoad()
	{
		string path = "ScriptableObjectData/DesignerData";
		DesignerData o = Resources.Load (path, typeof(DesignerData)) as DesignerData;
		Debug.Log (o.data.item.c);
	}



}


你可能感兴趣的:(Unity)