【Unity】 ScriptableObject ——生成多个ScriptableObject作为子对象,可以点击展开并显示二级菜单
官方是这么介绍ScriptabelObject的:
“ScriptableObject 是一个可独立于类实例来保存大量数据的数据容器。ScriptableObject 的一个主要用例是通过避免重复值来减少项目的内存使用量。如果项目有一个预制件在附加的 MonoBehaviour 脚本中存储不变的数据,这将非常有用。
每次实例化预制件时,都会产生单独的数据副本。这种情况下可以不使用该方法并且不存储重复数据,而是使用 ScriptableObject 来存储数据,然后通过所有预制件的引用访问数据。这意味着内存中只有一个数据副本。
就像 MonoBehaviour 一样,ScriptableObject 派生自基本 Unity 对象,但与 MonoBehaviour 不同,不能将 ScriptableObject 附加到游戏对象。正确的做法是需要将它们保存为项目中的资源。
如果使用 Editor,可以在编辑时和运行时将数据保存到 ScriptableObject,因为 ScriptableObject 使用 Editor 命名空间和 Editor 脚本。但是,在已部署的构建中,不能使用 ScriptableObject 来保存数据,但可以使用在开发期间设置的 ScriptableObject 资源中保存的数据。
从 Editor 工具作为资源保存到 ScriptableObject 的数据将写入磁盘,因此将在会话之间一直保留。”
但是在实际项目中,如果遇到需要配置很多个同类型ScriptableObject对象,但是ScriptableObject具体数据不同的情况下,如果全部保存成单个文件,看下来会比较乱。
于是我们可以把归属于同一个模块的ScriptabelObject放入同一个大的模块下,在后期查找修改也比较方便。

1.想要获得上方的效果,首先我们需要一个最外层ScriptabelObject对象
using System.Collections;
using System.Collections.Generic;
using UnityEngine; [CreateAssetMenu(fileName = "ItemTemplate", menuName = "Custom/ItemTemplate")]
public class ItemTemplate : ScriptableObject
{
public List<SubItemTemplate> subItems = new List<SubItemTemplate>();
}
通过这个类,我们可以点击菜单栏的Assets→Creat→Custem→ItemTemplate创建一个ScriptabelObject对象。
2.最外层ScriptabelObject需要包含若干子对象,具备一个折叠效果
using System.Collections;
using UnityEngine; [CreateAssetMenu(fileName = "SubItem", menuName = "Custom/SubItem")]
public class SubItemTemplate : ScriptableObject
{ public int ID; }
3.需要自己定义一个Editor编辑器拓展,使得在Inspector界面上具备一定的功能。

using UnityEditor;
using UnityEngine; [CustomEditor(typeof(ItemTemplate))]
public class ItemTemplateEditor : Editor
{
public override void OnInspectorGUI()
{
base.OnInspectorGUI(); GUILayout.Space(10); ItemTemplate mainObject = (ItemTemplate)target; if (GUILayout.Button("Add Child Object"))
{
SubItemTemplate childObject = ScriptableObject.CreateInstance<SubItemTemplate>();
childObject.name = "SubItem"; Undo.RegisterCreatedObjectUndo(childObject, "Create Child Object"); AssetDatabase.AddObjectToAsset(childObject, mainObject);
AssetDatabase.SaveAssets(); mainObject.subItems.Add(childObject);
EditorUtility.SetDirty(mainObject);
} GUILayout.Space(10); if (GUILayout.Button("Remove All Child Objects"))
{
foreach (SubItemTemplate childObject in mainObject.subItems)
{
AssetDatabase.RemoveObjectFromAsset(childObject);
DestroyImmediate(childObject, true);
} mainObject.subItems.Clear();
AssetDatabase.SaveAssets(); EditorUtility.SetDirty(mainObject);
}
}
}
【Unity】 ScriptableObject ——生成多个ScriptableObject作为子对象,可以点击展开并显示二级菜单的更多相关文章
- Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据
Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据 unity unity Editor ScirptableObject Unity编辑器扩展 Chapt ...
- Unity 自动生成组件索引类工具
Unity 自动生成组件索引类工具 需求由来 我们在写UI类时 需要获取预设中的组件 joystick = transform.Find("joystick"); backgrou ...
- Unity 梯子生成算法
Unity之生成梯子算法的实现. 1.通过预制物体动态生成角度可设置的梯子形状. 1.1 主要涉及到的数学知识点,角度与弧度的转化. 弧度=角度乘以π后再除以180 角度=弧度除以π再乘以180 1. ...
- Unity之生成扫描二维码
Unity之生成扫描二维码 Unity之生成扫描二维码 前言 开篇 Unity版本及使用插件 正题 前期准备 首先生成二维码 然后需要扫描二维码 该使用了 挂载脚本绑定按钮和输入框 运行内容 生成二维 ...
- unity, unity默认的Arial字体在编译出的h5版本中不显示
unity默认的Arial字体在编译出的h5版本中不显示.改用自己的字体可显示.
- 巨蟒django之权限7:动态生成一级&&二级菜单
内容回顾: . 权限的控制 . 表结构设计 存权限的信息 用户表 - name 用户名 - pwd 密码 - roles 多对多 角色表 - name - permissions 多对多 权限表 - ...
- (五)Unity插件生成
1)新建空的AndroidStudio工程,但是新建过程时最小SDK版本要与unity一致,如下图所示,本次操作均为api16 2)创建Library,如下图所示,新建module,然后选择Andro ...
- unity,生成的mac版游戏切场景时卡死解法
unity版本为5.1.1,在编辑器里运行没问题,build出的windows版运行也没问题,但build出的mac版在个别场景切换时会卡死,通过查看log(查看build版本log的方法参考:htt ...
- unity 3d 生成apk文件时,设置图标
如图所示:注意红线标注部分: 如果安装到手机之后,程序的图标还是unity的默认图标,重启手机即可.
- Unity自动生成AnimatorController
上一篇写了如何自动切割动画,这一篇写如何自动生成AnimatorController. 之前网上查了很多资料,看的一直很蒙,看不懂是怎么回事的,这里我先给大家明确几个概念: 画的不好,大家将就着看,写 ...
随机推荐
- 三个编程思想:面向对象编程、面向接口编程、面向过程编程【概念解析系列_1】【C# 基础】
〇.前言 对于 .Net 中的编程思想还是十分重要的,也是编码出高效的程序的基础! 在使用之前了解其本质,那么用起来就游刃有余.下面来简单对比下三个编程思想,看下它们都是什么,它们之间又有什么关系. ...
- python:时间模块dateutil
安装 pip install python-dateutil dateutil模块主要有两个函数,parser和rrule. 其中parser是根据字符串解析成datetime,而rrule则是根据定 ...
- http头部字段Origin和Access-Control-Allow-Origin解决请求跨域
Http协议中请求头和响应头携带了很多信息,其中 请求头 Origin,响应头 Access-Control-Allow-Origin 与跨域有关. 为了验证跨域,要将客户端和服务端分配在不同端口,这 ...
- 从头到尾说一次 Spring 事务管理(器)
事务管理,一个被说烂的也被看烂的话题,还是八股文中的基础股之一. 本文会从设计角度,一步步的剖析 Spring 事务管理的设计思路(都会设计事务管理器了,还能玩不转?) 为什么需要事务管理? 先看看 ...
- 从原理聊 JVM(五):JVM 的编译过程和优化手段
一.前端编译 前端编译就是将Java源码文件编译成Class文件的过程,编译过程分为4步: 1 准备 初始化插入式注解处理器(Annotation Processing Tool). 2 解析与填充符 ...
- 小白python和pycharm安装大佬勿扰
编程语言发展和Python安装 计算机语言的发展 机器语言 1946年2月14日,世界上第一台计算机ENIAC诞生,使用的是最原始的穿孔卡片.这种卡片上使用的语言是只有专家才能理解的语言,与人类语言差 ...
- 智能AI 的应用场景
小凡智能AI是一款基于人工智能技术开发的助软件,能够帮助用户解决各种各样的问题,提高工作效率和生活质量.它的应用范围广泛,涵盖了工作.学习.健康等多个方面,为用户提供了全方位的服务支持. 在工作方面, ...
- Codeforces 1462F The Treasure of The Segments
题意 给\(n(1\leq n\leq 2*10^5)\)个线段$[l_i,r_i] (1≤l_i≤r_i≤10^9) $,问最少删除几个线段,使得剩下线段中,有至少一个线段与所有线段相交. 分析 对 ...
- 完全可复制、经过验证的 Go 工具链
原文在这里. 由 Russ Cox 发布于 2023年8月28日 开源软件的一个关键优势是任何人都可以阅读源代码并检查其功能.然而,大多数软件,甚至是开源软件,都以编译后的二进制形式下载,这种形式更难 ...
- 《Python魔法大冒险》 001 序章:少年小鱼的不平凡一天
在一个普通的城市里,生活着一个名叫小鱼的少年.他是一名初中生,但在班级里,他的学习成绩总是垫底.同学们经常取笑他,有时甚至戏称他为"倒数王". 放学后,小鱼一个人走在回家的路上,他 ...