2.创建ScriptableObject数据文件

2.ScriptableObject数据文件的创建


2.1 知识点

自定义ScriptableObject数据容器

自定义ScriptableObject数据容器的步骤

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

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

继承ScriptableObject类,声明成员(变量、方法等)

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

    public int i;
    public float f;
    public bool b;

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

可以在Inspector窗口直接关联这些变量的默认变量,默认变量的关联信息在meta中被记录。


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

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

创建数据文件具体的方法有两种:

为类添加CreateAssetMenu通过菜单创建资源特性 [CreateAssetMenu(fileName = “默认文件名”, menuName = “在Asset/Create菜单中显示的名字”, order = 再Asset/Create菜单中的位置(多个时可以通过它来调整顺序))]
[CreateAssetMenu(fileName ="MrTangData", menuName ="ScriptableObject/我的数据", order = 0)]
public class MyData : ScriptableObject
{
}

加了这个特性之后就可以在菜单栏创建选项中创建自己定义的数据文件资源了。

创建的文件名和配置的相同,其他公共变量也显示出来了,有默认值的变量会默认关联我们自己配置的默认值。

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

创建一个脚本,在脚本汇总创建一个静态方法,方法中添加 [MenuItem(“菜单栏/子菜单栏”)]特性

public class ScriptableObjectTool
{
    [MenuItem("菜单栏/子菜单栏")]
    public static void CreateMyData()
    {
    }
}

添加后可以在菜单栏看到我们添加的菜单选项,点击时执行的就是刚刚加了特性的静态方法。

写静态方法中的创建数据文件逻辑,这样在点击添加自己创建的菜单按钮时会创建数据文件。

[MenuItem("ScriptableObject/CreateMyData")]
public static void CreateMyData()
{
    //书写创建数据资源文件的代码 <T>中一定要继承ScriptableObject
    MyData myDataAsset = ScriptableObject.CreateInstance<MyData>();

    //通过编辑器API 根据数据创建一个数据资源文件
    AssetDatabase.CreateAsset(myDataAsset, "Assets/Unity进阶ScriptableObject教程/Lesson02_ScriptableObject数据文件的创建/MyDataTest.asset");

    //保存创建的资源
    AssetDatabase.SaveAssets();

    //刷新界面
    AssetDatabase.Refresh();
}

ScriptableObject好处的体现

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

总结

创建ScriptableObject数据类非常简单:

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

2.2 知识点代码

Lesson02_ScriptableObject数据文件的创建

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson02_ScriptableObject数据文件的创建 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 自定义ScriptableObject数据容器
        //1.继承ScriptableObject类
        //2.在该类中声明成员(变量、方法等)

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

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

        //具体的方法有两种:
        //1.为类添加CreateAssetMenu通过菜单创建资源特性
        //[CreateAssetMenu(fileName = "默认文件名", menuName = "在Asset/Create菜单中显示的名字", order = 再Asset/Create菜单中的位置(多个时可以通过它来调整顺序))]

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

        
        
       
        #endregion

        #region 知识点三 ScriptableObject好处的体现
        //1.更方便的配置数据,我们可以直接在Inspector当中配置数据
        //2.项目之间的复用,我们可以拷贝继承ScriptableObject的脚本到任何工程中
        #endregion

        #region 总结
        //创建ScriptableObject数据类非常简单
        //1.继承它
        //2.声明需要的数据变量
        //3.添加对应的特性,让我们可以在Unity中真正的创建出数据资源文件
        #endregion
    }
}

ScriptableObjectTool

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class ScriptableObjectTool
{
    [MenuItem("ScriptableObject/CreateMyData")]
    public static void CreateMyData()
    {
        //书写创建数据资源文件的代码 <T>中一定要继承ScriptableObject
        MyData myDataAsset = ScriptableObject.CreateInstance<MyData>();

        //通过编辑器API 根据数据创建一个数据资源文件
        AssetDatabase.CreateAsset(myDataAsset, "Assets/Resources/MyDataTest.asset");
        //AssetDatabase.CreateAsset(myDataAsset, "Assets/Unity进阶ScriptableObject教程/Lesson02_ScriptableObject数据文件的创建/MyDataTest.asset");

        //保存创建的资源
        AssetDatabase.SaveAssets();

        //刷新界面
        AssetDatabase.Refresh();
    }
}

MyData

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;

[CreateAssetMenu(fileName ="MrTangData", menuName ="ScriptableObject/我的数据", order = 0)]
public class MyData : ScriptableObject
{
    //声明成员时需要注意
    //我们可以声明任何类型的成员变量
    //但是需要注意:如果希望之后在Inspector窗口中能够编辑它
    //那你在这里声明的变量规则 要和 MonoBehavior当中public变量的规则是一样的

    public int i;
    public float f;
    public bool b;

    public GameObject obj;
    public Material m;
    public AudioClip audioClip;
    public VideoClip videoClip;

}

2.3 练习题

请使用ScriptableObject制作一个用于存储游戏设置信息的数据:音乐音效开关和音乐音效大小

创建SettingInfo,继承ScriptableObject,声明音乐音效开关和音乐音效大小变量

public class SettingInfo : ScriptableObject
{
    //音乐和音效的开关
    public bool musicIsOpen;
    public bool soundIsOpen;
    
    //音乐和音效的 大小
    public float musicValue;
    public float soundValue;
}

给脚本添加CreateAssetMenu特性,设置好默认文件名和创建菜单

[CreateAssetMenu(fileName = "SettingInfo", menuName = "ScriptableObject/音乐音效设置信息")]
public class SettingInfo : ScriptableObject

创建数据文件


2.4 练习题代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName = "SettingInfo", menuName = "ScriptableObject/音乐音效设置信息")]
public class SettingInfo : ScriptableObject
{
    //音乐和音效的开关
    public bool musicIsOpen;
    public bool soundIsOpen;

    //音乐和音效的 大小
    public float musicValue;
    public float soundValue;
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏