首页 > 其他分享 >【Unity】 ScriptableObject ——生成多个ScriptableObject作为子对象,可以点击展开并显示二级菜单

【Unity】 ScriptableObject ——生成多个ScriptableObject作为子对象,可以点击展开并显示二级菜单

时间:2023-10-08 16:13:35浏览次数:39  
标签:菜单 ScriptableObject mainObject Unity ItemTemplate using childObject public

 

官方是这么介绍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);
        }
    }
}
View Code

 

标签:菜单,ScriptableObject,mainObject,Unity,ItemTemplate,using,childObject,public
From: https://www.cnblogs.com/WantPeach/p/17749431.html

相关文章

  • 隐藏apps菜单
     <recordid="utm.menu_link_tracker_root"model="ir.ui.menu"><fieldname="active"eval="False"/></record><recordid="base.menu_management"mode......
  • 记录--Vue 右键菜单的秘密:自适应位置的实现方法
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助下图这个情景,你是否也遇到过?当你右键点击网页上的某个元素时,弹出的菜单被屏幕边缘遮挡了,导致你无法看清或选择菜单项?上图中右键菜单的选项并不是固定不变的,它会根据不同的元素或场景来显示不同的选项。也就是......
  • vue2自定义指令实现el-dropdown下拉菜单项最小宽度等于内容宽度
    //在main.js添加Vue.directive('siem-dropdown',function(el,binding,vNode){letul=el.querySelector("ul")letuid=vNode.componentInstance._uid;//获取下拉菜单实例的uidletsiemDropdownClass=`siem-dropdown-${uid}`;ul.cla......
  • Eclipse修改代码以及菜单字体大小
    (1)首先找到菜单栏的窗口(Windows)选项,然后点开,再点击首选项(preferences)(2)然后点击常规(General),然后找到外观(Appearence),然后找到颜色和字体(ColorsandFonts)(3)然后找到基本(Basic),然后点击标题字体,再然后点击编辑,选择自己想要的大小二:更改Java字体找到Java,然后修改字体大小,......
  • 从零开始学Unity(一)-主要窗口及功能区域
    声明:本人学习过程跟随NeilianAryan大佬课程从零开始的Unity魔法学堂学习部分思路及案例可能来源于课程内案例做此笔记仅为记录学习过程方面日后整理及回顾如有侵权联系删除谢谢!!unity主要窗口Scene、Game、Hierarchy、Inspector、Project、ConsoleScene场景窗口在默......
  • 【翻译中】骇入Unity游戏(2)-操作与控制
    【翻译中】骇入Unity游戏(2)-操作与控制来源:https://www.hypn.za.net/blog/2020/04/19/hacking-unity-games-part-2-manipulating/......
  • 《DjangoApp开发》第二集,创建项目骨架、主菜单页面及跳转
    2023年10月3日这节课做的事情创建项目目录对项目进行全局时间、配置创建项目骨架,配置一堆文件写主页面切换页面项目结构。当我们发现代码很长的时候就分成多个子目录菜单界面对战界面玩家玩家的技能玩家的每一个技能玩家的移动背景时间设置界......
  • 什么是 VMware Workstation Player 的 Unity 模式
    VMwareWorkstationPlayer的Unity模式是该虚拟化软件的一个令人印象深刻的功能,它允许用户将虚拟机中的应用程序窗口集成到主机操作系统的桌面环境中,使其看起来就像是在主机上运行的本地应用程序。Unity模式提供了出色的用户体验,同时提高了工作效率,特别是对于需要在虚拟机和主机操......
  • 用sql语句查询出表结构,在结果就能看到数据库所有表的结构,这个时候只要全选,然后右击出
    SELECT表名=CaseWhenA.colorder=1ThenD.nameElse''End,表说明=CaseWhenA.colorder=1Thenisnull(F.value,'')Else''End,字段序号=A.colorder,字段名=A.name,字段说明=isnull(G.[value],......
  • Unity性能优化-GPU Instancing
    GPUInstancing是Unity的一种优化技术。使用GPUInstancing可以在一个DrawCall中同时渲染多个相同或类似的物体,从而减少CPU和GPU的开销。官方文档:https://docs.unity3d.com/Manual/GPUInstancing.html要启用GPUInstancing,我们可以选中一个材质,然后在Inspector窗口勾选Enable......