什么是ScriptableObject
- ScriptableObject 是 Unity 提供的一个数据配置存储基类,它是一个可以用来保存大量数据的数据容器,我们可以将它保存为自定义的数据资源文件。
- ScriptableObject 是一个类似 MonoBehaviour 的基类,继承自 UnityEngine.Object 。要想使用它,需要我们写个脚本去继承 ScriptableObject 。需要注意的是,继承自 SctiptableObject 的脚本无法挂载到游戏物体上,毕竟它不是继承自 MonoBehaviour。
- ScriptableObject 类的实例会被保存成资源文件(.asset文件),和预制体,材质球,音频文件等类似,都是一种资源文件,存放在 Assets 文件夹下,创建出来的实例也是唯一存在的。 Unity官方文档
ScriptableObject的使用
主要用例:
- 在编辑模式下保存和存储数据
- 将数据保存为项目中的资源,方便在运行时使用
使用Scriptable需要在创建一个脚本并继承自ScriptableObject类,通过使用CreateAssetMenu属性来创建由自定义ScriptableObject类生成的资源。
ScriptableObject资源的创建:
//方法1:在编辑器菜单中创建
[CreateAssetMenu(fileName = "NewScriptableObject", menuName = "CreateScriptableObject", order = 0)]
//创建一个Asset资源菜单菜单名称为:"CreateScriptableObject",文件名称:"NewScriptableObject"
public class NewSO : ScriptableObject
{
public GameObject GameObject;
public Vector3[] spawnPoints;
public int spawnCount;
public string name;
}
//方法2:在菜单栏中通过静态方法创建 需要继承UnityEditor
public class ScriptableObjectTool
{
[MenuItem("ScritableObject/CreateData")]
public static void CreateMyData()
{
//创建数据资源文件
//泛型是继承自ScriptableObject的类
BulletData asset = ScriptableObject.CreateInstance<NewSO>();
//前一步创建的资源只是存在内存中,现在要把它保存到本地
//通过编辑器API,创建一个数据资源文件,第二个参数为资源文件在Assets目录下的路径
AssetDatabase.CreateAsset(asset, "Assets/Resources/ScriptableObject/NewSO.asset");
//保存创建的资源
AssetDatabase.SaveAssets();
//刷新界面
AssetDatabase.Refresh();
}
}
ScriptableObject实例的使用:
public class CreateGameobject : MonoBehaviour
{
public NewSO newSO;
private NewSO newSO01;
void Start()
{
newSO01 = ScriptableObject.Instantiate(newSO);
newSO01.name = "新的预制体";
//实例化一个新的NewSO对象通过已用的NewSO对象,并对name字段重新赋值,其余值与newSO对象相同
//ScriptableObject.CreateInstance<NewSO>();==>创建一个全新的NewSO对象
SpawnEntities();
}
private void SpawnEntities()
{
for (int i = 0; i < newSO01.spawnCount; i++)
{
GameObject gameObject = Instantiate(newSO01.GameObject, newSO01.spawnPoints[i], Quaternion.identity);
gameObject.name = newSO01.name + i;
DontDestroyOnLoad(gameObject);
}
}
}