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