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、AB包、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
很类似,它也存在生命周期函数
但是生命周期函数的数量更少,主要做了解,一般我们使用较少
-
Awake()
数据文件创建时调用1
2
3
4private void Awake()
{
Debug.Log("数据文件创建时会调用");
}在你使用上一章的根据ScriptableObject数据容器创建数据文件的方法或者创建非持久化数据时,才会调用这里的
Awake()
-
OnDestroy()
ScriptableObject 对象将被销毁时调用1
2
3
4private void OnDestroy()
{
Debug.Log("数据文件将被删除销毁时会调用");
}对象将被销毁时(指的是代码创建出的继承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;
}
} -
复用数据
如果多个对象关联同一个数据文件,相当于他们复用了一组数据,内存上更加节约空间