Unity中ScriptableObject用法整理

一.ScriptableObject概述

官方手册的描述:

ScriptableObject 是一个可独立于类实例来保存大量数据的数据容器。ScriptableObject 的一个主要用途是通过避免重复值来减少项目的内存使用量。如果项目有一个预制件在附加的 MonoBehaviour 脚本中存储不变的数据,这将非常有用。

每次实例化预制件时,都会产生单独的数据副本。这种情况下可以不使用该方法并且不存储重复数据,而是使用 ScriptableObject 来存储数据,然后通过所有预制件的引用访问数据。这意味着内存中只有一个数据副本。

就像 MonoBehaviour 一样,ScriptableObject 派生自基本 UnityEngine.Object,但不同于 MonoBehaviour 之处在于,不能将 ScriptableObject 附加到游戏对象。正确的做法是需要将它们保存为项目中的资源。

如果使用 Unity Editor,可以在编辑时和运行时将数据保存到 ScriptableObjects,因为 ScriptableObjects 使用 Editor 命名空间和 Editor 脚本。但是,在已部署的构建中,不能使用 ScriptableObject 来保存数据,但可以使用在开发期间设置的 ScriptableObject 资源中保存的数据。

精简结论(自己理解):ScriptableObject是Unity中以数据复用,节省内存为目的一个类,实际应用中通常指的是一个存储固定数据的资源。

下文 ScriptableObject 简称 SO ,所有代码均来自商业项目。

脚本中SO的使用

​

Editor中SO作为资源保存

​

二.SciptableObject使用步骤

2.1 开发继承SciptableObject的自定义脚本

脚本要继承SO, 作为一个数据模板,在脚本内定义要存储的数据,下面示例中仅存储一个Sprite对象

2.2 创建数据文件(SO模板的实例)

选中目录,根据脚本中CreateAssetMenu特性中的目录,即可创建数据资源

可以看到数据资源的和脚本中的定义一样,仅有一个Sprite

2.3 在脚本中访问SO的实例

A.类中定义SO对象,Editor中对字段赋值

B.SO对象作为方法参数

三.SO的优势

全局访问

不需要通过静态变量或单例,就能在项目中任何地方访问数据。只需在 Inspector 中拖入对应的 ScriptableObject 资源即可。

解耦设计

不同的系统通过引用相同的 ScriptableObject 资源来共享数据,而不是直接相互引用。这大大降低了代码耦合度,提高了可维护性。

跨场景持久化

ScriptableObject 的数据在场景切换时会保持,不需要使用 DontDestroyOnLoad 或其他复杂的持久化机制。

设计师友好

数据存储在资源文件中,策划和设计师可以直接在 Inspector 中修改数值,无需修改代码。

减少硬编码

使用ScriptableObject可以将游戏配置从代码中解耦,降低了硬编码的程度。这使得在不重新编译游戏的情况下进行更改和调整变得更加容易,同时降低了出现错误的风险。

四.参考

脚本/面向对象的开发/基本 Unity 类型/ScriptableObject

相关推荐
Martina_03213 天前
AI生成3D场景导入 Unity/Unreal 后,NPC 总串层?用6步检查导航高度与跨层连接
人工智能·游戏·数学建模·3d·unity·自然语言处理·aigc
小贺儿开发3 天前
Unity 局域网遥控幻灯片展示工具 3.0
科技·http·unity·工具·ppt·通信·网页
WarPigs5 天前
Unity对象不应该使用null传播的问题
unity
每日出拳老爷子6 天前
【VR】【Unity】抓走转放系列21|一天搭完门和抽屉工具槽:小场景按这个次序拼装
unity·vr·驱动·排错·snap zone
淡海水7 天前
02-02-原理篇-分代GC
算法·unity·c#·游戏引擎·.net·gc
小贺儿开发7 天前
Unity 文物新生 会讲故事的文物展墙
人工智能·科技·unity·ai·视频·互动·演示
淡海水7 天前
02-03-原理篇-大对象堆
unity·c#·游戏引擎·.net·gc
WarPigs8 天前
Unity在Create菜单添加创建自定义脚本模板选项
unity
淡海水8 天前
02-01-原理篇-Mark-Sweep与变种算法
算法·unity·c#·游戏引擎·.net·gc
babywang08 天前
Unity笔记--塔防游戏中的ECS架构:从原理到实战的全面解析
unity·ecs架构