U4S2L1——ScriptableObject 数据文件的创建

本章代码关键字

1
2
3
4
5
6
ScriptableObject                        //数据配置存储基类,自定义的数据资源文件需要继承它
[CreateAssetMenu()] //通过菜单创建资源特性,参数分别是是默认文件名,为在Asset/Create菜单中显示的名字,排序优先级
ScriptableObject.CreateInstance<>() //创建数据资源文件的方法,泛型参数为要创建的ScriptableObject派生类
AssetDatabase.CreateAsset() //传入要保存的资源文件和存储路径,在指定目录下创建文件
AssetDatabase.SaveAssets() //将创建的资源文件保存下来
AssetDatabase.Refresh() //刷新Project窗口

ScriptableObject数据文件的创建

创建ScriptableObject​数据类非常简单

  1. 继承ScriptableObject
  2. 声明需要的数据变量
  3. 添加对应的特性,让我们可以在Unity中真正的创建出数据资源文件

自定义ScriptableObject数据容器

  1. 继承ScriptableObject​类
  2. 在该类中声明成员(变量、方法等)

我们可以声明任何类型的成员变量
但是需要注意:如果希望之后在Inspector窗口中能够编辑它,那你在这里声明的变量规则要和MonoBehavior当中public变量的规则是一样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using UnityEngine;
using UnityEngine.Video;

public class MyData : ScriptableObject
{
public int i;
public float f;
public bool b;

public GameObject obj;
public Material material;
public AudioClip audioClip;
public VideoClip videoClip;
}

image

注意:声明后,我们便可以在Inspector窗口中看到变化
我们可以在其中进行设置,但是这些设置都是默认数据,并没有真正使用他们
这些关联信息都是通过脚本文件对应的Unity配置文件.meta进行记录的
目前该数据只是一个数据容器模板,有了它我们之后才能根据它的信息创建对应的数据资源文件

根据自定义的ScriptableObject数据容器创建数据文件

注意:
该创建功能,其实就是根据自定义数据容器类创建了一个配置文件
该文件中记录了对应的数据容器类信息,以及其中变量关联的信息
之后我们在使用它时,本质上也是通过反射创建对象进行使用

具体的方法有两种:

  1. 为类添加[CreateAssetMenu()]​通过菜单创建资源特性

    1
    2
    3
    [CreateAssetMenu(fileName = "默认生成的文件名",
    menuName = "在Asset/Create菜单中显示的名字",
    order = 在Asset/Create菜单中的位置(有多个添加这种特性的类时可以通过它来调整顺序))]

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    using UnityEngine;
    using UnityEngine.Video;

    [CreateAssetMenu(fileName = "MyScriptableObjectData",
    menuName = "ScriptableObject/我的数据",
    order = 0)]
    public class MyData : ScriptableObject
    {
    public int i;
    public float f;
    public bool b;

    public GameObject obj;
    public Material material;
    public AudioClip audioClip;
    public VideoClip videoClip;
    }

    ​​image​​

    点击后就会自动创建数据文件,它基于之前编辑的MyData​脚本

    image​​

  2. 利用ScriptableObject的静态方法创建数据对象,然后将数据对象保存在工程目录下

    该方法会用到特性MenuItem()​,和一部分编辑器的知识

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    using UnityEditor;
    using UnityEngine;

    public class ScriptableObjectTool
    {
    [MenuItem("ScriptableObject/CreateMyData")]
    public static void CreateMyData()
    {
    //书写创建数据资源文件的代码
    MyData asset = ScriptableObject.CreateInstance<MyData>();
    //通过编辑器API 根据数据创建一个数据资源文件
    AssetDatabase.CreateAsset(asset, "Assets/Resources/MyDataTest.asset");
    //保存创建的资源
    AssetDatabase.SaveAssets();
    //刷新界面
    AssetDatabase.Refresh();
    }
    }

    以上代码就会在工具栏生成对应的选项,点击后生成配置文件,不同的配置文件数据不互通

    ​​imageimage

ScriptableObject好处的体现

  1. 更方便的配置数据,我们可以直接在Inspector当中配置数据
  2. 项目之间的复用,我们可以拷贝继承ScriptableObject的脚本到任何工程中