Unity中的ScriptableObject 脚本化对象
ScriptableObject 脚本化对象
ScriptableObject 是一个可序列化的 Unity 类,允许您独立于脚本实例存储大量共享数据。使用 ScriptableObjects 可以更轻松地管理更改和调试。您可以在游戏中的不同系统之间建立一定程度的灵活通信,以便在整个生产过程中更改和调整它们以及重用组件更易于管理。
ScriptableObject是一个数据容器,它可以用来保存大量数据,主要的用处就是在项目中通过将数据存储在ScriptableObject对象,避免值拷贝来减少游戏运行中的内存占用。当你有一个预制体,上面挂了一个存有不变数据的MonoBehaviour 脚本时,每次我们实例化预制体时都将产生一次数据拷贝,这时我们可以使用ScriptableObject对象来存储数据,然后通过引用来访问预制体中的数据。这样可以避免在内存中产生一份拷贝数据。与MonoBehaviour 一样,ScriptableObject也继承自Unity基类object,但是与MonoBehaviour不同的是,ScriptableObject不能和GameObject对相关联,相反,通常我们会将它保存为Assets资源。(放在项目文件夹中)
在编辑器模式下,我们可以在编辑和运行时将数据保存到ScriptableObject,因为保存ScriptableObject需要用到编辑器空间下的脚本,但是在打包后不能使用ScriptableObject来保存数据,只可以使用ScriptableObject资源中已保存的数据。
ScriptableObjects 的主要用例为:
- 在 Editor 会话期间保存和存储数据
- 将数据保存为项目中的资源,以便在运行时使用
也就是说,通过这个脚本存储数据,来统一分配给其他脚本,可以节省资源与性能。
创建脚本化对象:使用CreateAssetMenu,轻松创建自定义资源,比如:
然后就可以右键菜单创建一个这个类的实例了
可以创建多个不同的实例,以命名区分,赋上不同的数据:
最后在MonoBehaviour脚本中使用这个类。
只需要对脚本更改Card实例的引用,就可以更改不同的数据。
任何使用该脚本的对象、预制件都会使用脚本化对象实例的数据来实例化
实例会以asset的格式保存:
你会在unity中看到这个图标:
是不是有点眼熟?没错,URP的渲染管线设置就是脚本化对象(的子类)。
每个都是某个类的实例,在使用时,我们把项目设置或者摄像机的引用指向某个实例,就可以使用它的参数来统一调整整体。
当然,这些对象也可以右键创建。
那么定义这些实例的类在哪里呢?
选中任意一个实例点击编辑脚本就可以跳转了。
注意这些实例并不是脚本,编辑这里跳转的脚本即为编辑定义这个类的脚本,会影响所有使用这个类的实例。
现在你可以理解脚本化对象了,我们经常在大纲里放一个空物件,然后绑定一个管理器脚本,用来设置、控制与存储场景里的数据,脚本化对象的实例做的是同样的事情。但是它不存在于场景中,而是存在于项目Assets文件夹中,尽管它和带脚本的空物件一样只是一个实例。但是正因为它存在于场景之外,所以可以用来存储大量数据而不受场景启动与否的影响。对于很多调试的场合或者跨场景的设置来说非常实用。如果需要同一设置的多套参数,我们只需要再新建一个实例。(比如URP不同质量下的渲染就各有一个Asset)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤