4.ScriptableObject数据非持久化

4.ScriptableObject非持久数据


4.1 知识点

ScriptableObject的非持久化数据指的是什么

  • 指的是不管在编辑器模式还是在发布后都不会持久化的数据。
  • 我们可以根据自己的需求随时创建对应数据对象进行使用,就好像直接new一个数据结构类对象。

如何利用ScriptableObject生成非持久化的数据

ScriptableObject.CreateInstance方法

public MyData myData;

//利用ScriptableObject中的静态方法 CreateInstance<>()
//可以理解为这是ScriptableObject  new出一个我们自己写好的数据结构
//该方法可以在运行时创建出指定继承ScriptableObject的对象
//该对象只存在于内存当中,可以被GC
//调用一次就创建一次

//通过这种方式创建出来的数据对象 它里面的默认值 不会受到脚本中设置的影响
//就比如
//MyData脚本有关联默认的音乐切片文件和材质球 假如直接Inspector窗口创建的MyData数据文件会关联默认音乐切片文件和材质球
//这种方法创建出来的数据文件不会

//myData = ScriptableObject.CreateInstance("MyData") as MyData;//传类名一般不用
myData = ScriptableObject.CreateInstance<MyData>();

myData.PrintInfo();

Debug.Log(myData.audioClip);//Null
Debug.Log(myData.m);//Null

ScriptableObject的非持久化数据存在的意义

  • 只是希望在运行时能有一组唯一的数据可以使用。
  • 但是这个数据又不太希望保存为数据资源文件浪费硬盘空间。
  • 那么ScriptableObject的非持久化数据就有了存在的意义。
  • 它的特点是只在运行时使用,在编辑器模式下也不会保存在本地。

4.2 知识点代码

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

public class Lesson04_ScriptableObject非持久数据 : MonoBehaviour
{
    public MyData myData;

    void Start()
    {
        #region 知识点一 ScriptableObject的非持久化数据指的是什么
        //指的是不管在编辑器模式还是在发布后都 不会持久化的数据
        //我们可以根据自己的需求随时创建对应数据对象进行使用
        //就好像直接new一个数据结构类对象
        #endregion

        #region 知识点二 如何利用ScriptableObject生成非持久化的数据
        //利用ScriptableObject中的静态方法 CreateInstance<>()
        //可以理解为这是ScriptableObject  new出一个我们自己写好的数据结构
        //该方法可以在运行时创建出指定继承ScriptableObject的对象
        //该对象只存在于内存当中,可以被GC
        //调用一次就创建一次

        //通过这种方式创建出来的数据对象 它里面的默认值 不会受到脚本中设置的影响
        //就比如
        //MyData脚本有关联默认的音乐切片文件和材质球 假如直接Inspector窗口创建的MyData数据文件会关联默认音乐切片文件和材质球
        //这种方法创建出来的数据文件不会

        //myData = ScriptableObject.CreateInstance("MyData") as MyData;//传类名一般不用
        myData = ScriptableObject.CreateInstance<MyData>();

        myData.PrintInfo();

        Debug.Log(myData.audioClip);//Null
        Debug.Log(myData.m);//Null

        #endregion

        #region 知识点三 ScriptableObject的非持久化数据存在的意义

        //只是希望在运行时能有一组唯一的数据可以使用
        //但是这个数据又不太希望保存为数据资源文件浪费硬盘空间
        //那么ScriptableObject的非持久化数据就有了存在的意义
        //它的特点是
        //只在运行时使用,在编辑器模式下也不会保存在本地

        #endregion
    }

}

4.3 练习题

请在上一节课设置界面练习题的基础上,不直接关联设置数据文件,而是在运行时创建,让其变为不持久化数据。

在场景中把关联的数据文件设置为空。

在 Start 方法中使用 ScriptableObject.CreateInstance 方法创建赋值,注意这样就不会在编辑器中持久化,每次运行都是默认值。

// 创建设置信息实例
settingInfo = ScriptableObject.CreateInstance<SettingInfo>();

4.4 练习题代码

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

public class SettingPanel : MonoBehaviour
{
    public Toggle musicTog; // 音乐开关
    public Toggle soundTog; // 音效开关
    public Slider musicSlider; // 音乐滑动条
    public Slider soundSlider; // 音效滑动条

    public SettingInfo settingInfo; // 设置信息

    void Start()
    {
        // 创建设置信息实例
        settingInfo = ScriptableObject.CreateInstance<SettingInfo>();

        // 将设置信息应用到UI控件上
        musicTog.isOn = settingInfo.musicIsOpen;
        soundTog.isOn = settingInfo.soundIsOpen;
        musicSlider.value = settingInfo.musicValue;
        soundSlider.value = settingInfo.soundValue;

        // 当音乐开关控件值发生变化时,记录修改后的值到设置信息中
        musicTog.onValueChanged.AddListener((value) =>
        {
            settingInfo.musicIsOpen = value;
        });

        // 当音效开关控件值发生变化时,记录修改后的值到设置信息中
        soundTog.onValueChanged.AddListener((value) =>
        {
            settingInfo.soundIsOpen = value;
        });

        // 当音乐滑动条控件值发生变化时,记录修改后的值到设置信息中
        musicSlider.onValueChanged.AddListener((value) =>
        {
            settingInfo.musicValue = value;
        });

        // 当音效滑动条控件值发生变化时,记录修改后的值到设置信息中
        soundSlider.onValueChanged.AddListener((value) =>
        {
            settingInfo.soundValue = value;
        });
    }
}


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

×

喜欢就点赞,疼爱就打赏