相关文章推荐
强健的吐司  ·  34. Messaging·  3 年前    · 
风流倜傥的饭卡  ·  JS ...·  3 年前    · 
[Unity3D]ScriptableObject解析

[Unity3D]ScriptableObject解析

什么是ScriptableObject:

官方定义:

一个类,如果需要创建无需附加到游戏对象的对象时,可从该类派生。它对仅用于存储数据的资源最有用。

这个解释真的是很中文式翻译.小编给出自己的理解:首先ScriptableObject是继承Object的和MonoBehaviour一样的,但是又不一样,MonoBehaviour是以组件形式挂在GameObject上的,而ScriptableObject则以Assets资源的形式存在的.从官方给出的介绍大概是这样的,如果你需要存储数据,继承ScriptableObject类或许是更好的选择,因为ScriptableObject可以存储数据,模型,shader,材质等等.

总结就是在编辑器下可以保存和存储数据在本地Assets文件下,保存的数据可以共享,可以在当前整个项目进行引用或者其他项目共享,如果在真机运行情况下,是不可以操作的.

主要用途解析:

脚本化对象就是一个数据容器,可以用来存储大量的数据,它是可序列化的,这个特点也正决定了它的主要用途;一个主要用处就是通过将数据存储在ScriptableObject对象中来减少工程以及游戏运行时因拷贝值所造成的内存占用;

关于ScriptableObject在unity3d API:

对比MonoBehaviour有一些不足:

从api中可以看出,ScriptableObject也有类似于MonoBehaviour生命周期方法,但只有几个,还有如果在编辑器下修改数据,那可能就真的把数据更改了.这一点需要重视.


ScriptableObject使用:

1 创建Scriptable并保存文件源

解释CreateInstance:在游戏运行时创建一个Scriptable类型的实例,不使用时被GC回收;

ScriptableObject.CreateInstance()

例如:

namespace SYFramework
	public class SriptableState:ScriptableObject
		public string Name;
namespace SYFramework
	public class ScriptableTest : MonoBehaviour
		public SriptableState sriptableState;
		private void Awake()
			sriptableState= ScriptableObject.CreateInstance<SriptableState>(); //创建SriptableState资源对象
			sriptableState.Name = "小黑的名字";
			string path ="Assets/SriptableState.asset"; //路径
			UnityEditor.AssetDatabase.CreateAsset(sriptableState, path); //创建好的对象保存到本地路径
			UnityEditor.AssetDatabase.SaveAssets();//保存资源
			UnityEditor.AssetDatabase.Refresh();//刷新
			Debug.Log(sriptableState.Name);

运行之后结果:


2 CreateAssetMenuAttribute-使用ScriptableObject

命名空间在UnityEngine的一个特性,它有三个属性filename,menuname,order,它用于标记一个派生自Scriptable的类,可以在Assets下的create下添加子菜单项,用于创建.asset资源文件(Scriptable类是和.asset资源关联的);它和AddComponentMenu特性类似,只不过后者是将脚本组件添加到组件按钮的子菜单项,Unity中提供了很多用于编辑器菜单项扩展的属性例如MenuItem、ContextMenu,CreateAssetMeun,ContextMenuItem等等,我们往往根据它的名称就可以大概知道它用在什么地方;

CreateAssetMenuAttribute类似于打标签,如果一个继承ScriptableObject的类可以以CreatAssetMenu形式通过鼠标在Asset文件下直接创建,并且可以创建多个资源。这种情况是不需要填写资源路径,在Assets任何文件下都可以创建。

例如:

namespace SYFramework
	/// <summary>
	/// ScriptableObject
	/// </summary>
	[CreateAssetMenu(menuName ="Task/Step")]
	public class Step : ScriptableObject
		public string Name;

还有一种方式通过静态方法的形式,使用MenuItem特性可以在编辑器的状态栏中添加自己的标签,这种方法只能在编辑器情况下使用,并且创建的时候需要指明路径。

例如:

	public class Test{
		[MenuItem("SYFramework/Step/TestStep")]
		public static void CreatScirptable()
			Step step = ScriptableObject.CreateInstance<Step>();