什么是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);

        }
    }
}

ScriptableObject脚本API

****

****