U4S2L2——ScriptableObject 数据文件的使用
U4S2L2——ScriptableObject 数据文件的使用
本章代码关键字
1  | //在继承ScriptableObject的类内  | 
ScriptableObject 数据文件的使用
其实创建出来的数据资源文件,你可以把它理解成一种记录数据的资源
它的使用方式,和我们以前使用Unity当中的其它资源规则是一样的
比如:预设体、音频文件、视频文件、动画控制器文件、材质球等等
只不过它是通过继承 ScriptableObject 的类生成的数据资源文件,它主要是和数据相关的
- 
通过
Inspector 中的public 变量进行关联- 
创建一个数据文件
 - 
在继承
MonoBehaviour 类中申明数据容器类型的成员,在 Inspector 窗口进行关联1
2
3
4
5
6
7
8
9
10
11using UnityEngine;
public class Lesson2 : MonoBehaviour
{
public MyData data;
void Start()
{
data.PrintInfo();
}
}
 
 - 
 - 
通过资源加载的信息关联,加载数据文件资源
注意:Resources、AssetBundle、Addressables 都支持加载继承 
ScriptableObject 的数据文件1
2
3
4
5
6
7
8
9
10
11
12
13using UnityEngine;
public class Lesson2 : MonoBehaviour
{
public MyData data;
void Start()
{
//data.PrintInfo();
data = Resources.Load<MyData>("MyDataTest");
data.PrintInfo();
}
} 
注意:如果多个对象关联同一个数据容器文件,他们共享的是一个对象,因为是引用对象,所以在其中任何地方修改后,其它地方也会发生改变
ScriptableObject 的生命周期函数
ScriptableObject 和 MonoBehavior 类似,它也存在生命周期函数,
但是 ScriptableObject 生命周期函数的数量更少,主要做了解,一般我们使用较少
- 
Awake() 数据文件创建时调用1
2
3
4private void Awake()
{
Debug.Log("数据文件创建时会调用");
}在你使用上一章的 根据ScriptableObject数据容器创建数据文件的方法 或者 创建非持久化数据 时,才会调用这里的
Awake() - 
OnDestroy() ScriptableObject 对象将被销毁时调用1
2
3
4private void OnDestroy()
{
Debug.Log("数据文件将被删除销毁时会调用");
}对象将被销毁时(指的是代码创建出的继承ScriptableObject的类对象)调用(指的是代码创建出的继承
ScriptableObject 的类对象) - 
OnDisable() ScriptableObject 对象销毁时、即将重新加载脚本程序集时 调用1
2
3
4private void OnDisable()
{
Debug.Log("数据文件将被删除销毁时,即将重新加载脚本程序集时会调用");
}当 对象销毁时(指的是代码创建出的继承ScriptableObject的类对象) 或者 即将重新加载脚本时 就会调用这里的函数
 - 
OnEnable() ScriptableObject 创建或者加载对象时调用1
2
3
4private void OnEnable()
{
Debug.Log("数据文件创建或某个对象调用时会调用");
}当你创建脚本或者加载重新加载脚本时就会调用这里的函数
 - 
OnValidate() 编辑器才会调用的函数,Unity 在加载脚本或者 Inspector 窗口中更改值时调用1
2
3
4private void OnValidate()
{
Debug.Log("数据文件在加载脚本时或者Inspector窗口更改值时调用");
}当你通过修改 Inspector 窗口修改数据文件的值或者重新加载脚本时就会调用这里的函数,在编辑器才会起作用,发布后不起作用
 
ScriptableObject好处的体现
- 
编辑器中的数据持久化
通过代码修改数据对象中内容,会影响数据文件,相当于达到了编辑器中数据持久化的目的
警告:该数据持久化只是在编辑模式下的持久,发布之后的运行时并不会保存数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18using 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;
}
} - 
复用数据
如果多个对象关联同一个数据文件,相当于他们复用了一组数据,内存上更加节约空间
 
