[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>();