U4S2L2——ScriptableObject 数据文件的使用

本章代码关键字

1
2
3
4
5
6
//在继承ScriptableObject的类内
Awake() { } //数据文件创建时调用
OnDestroy() { } //ScriptableObject 对象将被销毁时调用
OnDisable() { } //ScriptableObject 对象销毁时、即将重新加载脚本程序集时 调用
OnEnable() { } //ScriptableObject 创建或者加载对象时调用
OnValidate() { } //编辑器才会调用的函数,Unity在加载脚本或者Inspector窗口中更改值时调用

ScriptableObject 数据文件的使用

其实创建出来的数据资源文件,你可以把它理解成一种记录数据的资源
它的使用方式,和我们以前使用Unity当中的其它资源规则是一样的
比如:预设体、音频文件、视频文件、动画控制器文件、材质球等等
只不过它是通过继承ScriptableObject​的类生成的数据资源文件,它主要是和数据相关的

  1. 通过Inspector​中的public​变量进行关联

    1. 创建一个数据文件

    2. 在继承MonoBehaviour​类中申明数据容器类型的成员,在Inspector窗口进行关联

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      using UnityEngine;

      public class Lesson2 : MonoBehaviour
      {
      public MyData data;

      void Start()
      {
      data.PrintInfo();
      }
      }

      image

  2. 通过资源加载的信息关联,加载数据文件资源
    注意:Resources、AB包、Addressables都支持加载继承ScriptableObject的数据文件

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

    public class Lesson2 : MonoBehaviour
    {
    public MyData data;

    void Start()
    {
    //data.PrintInfo();
    data = Resources.Load<MyData>("MyDataTest");
    data.PrintInfo();
    }
    }

注意:如果多个对象关联同一个数据容器文件,他们共享的是一个对象,因为是引用对象,所以在其中任何地方修改后,其它地方也会发生改变

ScriptableObject的生命周期函数

ScriptableObject​和MonoBehavior​很类似,它也存在生命周期函数
但是生命周期函数的数量更少,主要做了解,一般我们使用较少

  • Awake()​ 数据文件创建时调用

    1
    2
    3
    4
    private void Awake()
    {
    Debug.Log("数据文件创建时会调用");
    }

    在你使用上一章的根据ScriptableObject数据容器创建数据文件的方法或者创建非持久化数据时,才会调用这里的Awake()

  • OnDestroy()​ ScriptableObject 对象将被销毁时调用

    1
    2
    3
    4
    private void OnDestroy()
    {
    Debug.Log("数据文件将被删除销毁时会调用");
    }

    对象将被销毁时(指的是代码创建出的继承ScriptableObject的类对象)调用

  • OnDisable()​ ScriptableObject 对象销毁时、即将重新加载脚本程序集时 调用

    1
    2
    3
    4
    private void OnDisable()
    {
    Debug.Log("数据文件将被删除销毁时,即将重新加载脚本程序集时会调用");
    }

    当对象销毁时(指的是代码创建出的继承ScriptableObject的类对象)或者加载重新加载脚本时就会调用这里的函数

  • OnEnable()​ ScriptableObject 创建或者加载对象时调用

    1
    2
    3
    4
    private void OnEnable()
    {
    Debug.Log("数据文件创建或某个对象调用时会调用");
    }

    当你创建脚本或者加载重新加载脚本时就会调用这里的函数

  • OnValidate()​ 编辑器才会调用的函数,Unity在加载脚本或者Inspector窗口中更改值时调用

    1
    2
    3
    4
    private void OnValidate()
    {
    Debug.Log("数据文件在加载脚本时或者Inspector窗口更改值时调用");
    }

    当你通过修改Inspector窗口修改数据文件的值或者重新加载脚本时就会调用这里的函数,在编辑器才会起作用,发布后不起作用

ScriptableObject好处的体现

  1. 编辑器中的数据持久化

    通过代码修改数据对象中内容,会影响数据文件,相当于达到了编辑器中数据持久化的目的
    (该数据持久化只是在编辑模式下的持久,发布运行时并不会保存数据)

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

    public class Lesson2 : MonoBehaviour
    {
    public MyData data;

    // Start is called before the first frame update
    void Start()
    {
    //data.PrintInfo();
    data = Resources.Load<MyData>("MyDataTest");
    data.PrintInfo();
    //以下代码将在编辑模式下修改掉这个data对应的配置文件的值,但是发布运行时后将不起作用
    data.i = 9999;
    data.f = 5.5f;
    data.b = false;
    }
    }
  2. 复用数据

    如果多个对象关联同一个数据文件,相当于他们复用了一组数据,内存上更加节约空间