使用 Unity 开发 Android VR 应用系列之四——用 ScriptableObject 实现预加载

ScriptableObject 是一个数据容器类,可以用它来存储与类实例无关的数据。ScriptableObject 一个主要用途是利用它存储共享资源(比如 Prefab),减少无谓的复制,降低内存使用。

比如说,场景 A 和场景 B 都需要一个登录对话框。常规做法是创建一个 Prefab,分别在 A 和 B 中各自实例化;为了节省内存,可以在 ScriptableObject 中实例此 Prefab,在运行时将此 Prefab 实例添加到 A/B 场景中。

ScriptableObject 最典型的一个应用场景,便是用它来实现预加载了。

Player Settings 中预加载选项

如上图,在 Player Settings 的 Optimization 分类下有一个 Preloaded Assets 数组选项。数组列出的 .asset 类型的资源会在程序启动时加载,并一直存活到程序退出。

.asset 资源对应的就是 ScriptableObject。实现 ScriptableObject 类时,需使用 CreateAssetMenu 属性为此 ScriptableObject 在 Assets 菜单中创建一个使用入口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 模仿 lua,创建一个名字为 G 的类,意指此类为 Global used.
[CreateAssetMenu(fileName = "GlobalAsset", menuName = "GlobalAsset")]
public class G : ScriptableObject
{

// 实例被加载后会触发此回调
private void OnEnable()
{
// 缓存材质资源
...
// 预先创建对象池
...
}

}

上边的示例代码在 Assets-Create 菜单栏下创建了一个 GlobalAsset 菜单项,通过此菜单项便可方便地创建一个 GlobalAsset.asset 的资源文件。将此资源文件添加到预加载数组中后,程序启动时就会自动实例化一个 G 类实例,实例在被加载后会触发 OnEnable 消息,可以在此回调中实现具体的预加载逻辑。

简言之,ScriptableObject 是 Unity 提供的可完美取代 Singleton 的内建数据共享机制。

评论