Uinty ScriptableObject的用法

<pre name="code" class="plain">
 

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

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

		// 初始化lst2
		lst2 = new List<SubClass>();

		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<DesignerData>();
		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);
	}



}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值