首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当属性是列表时,如何在PropertyDrawer上实现ReorderableList

当属性是列表时,在PropertyDrawer上实现ReorderableList可以通过Unity的EditorGUILayout扩展来实现。下面是一个示例代码:

代码语言:txt
复制
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;

[CustomEditor(typeof(YourScript))]
public class YourScriptEditor : Editor
{
    private ReorderableList list;

    private void OnEnable()
    {
        list = new ReorderableList(serializedObject, serializedObject.FindProperty("yourListProperty"), true, true, true, true);

        list.drawHeaderCallback = rect =>
        {
            EditorGUI.LabelField(rect, "Your List Property");
        };

        list.drawElementCallback = (rect, index, isActive, isFocused) =>
        {
            var element = list.serializedProperty.GetArrayElementAtIndex(index);
            rect.y += 2;

            EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element, GUIContent.none);
        };

        list.onAddCallback = list =>
        {
            var index = list.serializedProperty.arraySize;
            list.serializedProperty.arraySize++;
            list.index = index;

            var element = list.serializedProperty.GetArrayElementAtIndex(index);
            element.objectReferenceValue = null;
        };
    }

    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        list.DoLayoutList();

        serializedObject.ApplyModifiedProperties();
    }
}

上述代码中,我们首先创建了一个ReorderableList对象,并设置了它的一些回调函数。在drawHeaderCallback回调中,我们绘制了列表的标题。在drawElementCallback回调中,我们绘制了列表中每个元素的GUI。在onAddCallback回调中,我们实现了添加新元素的逻辑。

然后,在自定义的Editor类中,我们重写了OnInspectorGUI方法,在该方法中调用了list.DoLayoutList()来绘制整个列表。

请注意,上述代码中的"YourScript"和"yourListProperty"需要替换为你自己的脚本和属性名称。

这样,当你在Inspector面板中选择一个拥有该列表属性的脚本时,你将能够在PropertyDrawer上实现可排序的列表。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Unity編輯器案列

首先在面板上隐藏默认的List绘制方法,使用HideInInspector隐藏属性: public class PistonE03 : MonoBehaviour { public float...我们自定义的面板是可以支持同时修改所有选中的组件的 // 如果我们在修改参数时使用的是serializedObject,那么这个功能Unity会自动完成的 // 但如果我们是直接使用"target"来访问和修改参数的话...是一个非常棒的查看数组类型变量的实现类。...m_LastTime ) * m_PlaybackModifier; // 当预览时间改变时,我们需要确保重绘这个窗口以便我们可以立即看到它的更新 //...UpdateIsMouseInValidArea( Rect sceneViewRect ) { // 确保cube handle只在需要的区域内绘制 // 在本例我们就是当鼠标移动到自定义的GUI上或更低的位置上时

1.4K20
  • Unity 实用技巧

    MinMax 特性 下面列出的代码是我实现的 “MinMax” 特性,通过使用该特性,我们可以在 Inspector 中更方便的编辑用于表示范围的 Vector2 结构字段. // MinMaxAttribute.cs...https://www.febucci.com/ [CustomPropertyDrawer(typeof(MinMaxAttribute))] public class MinMaxDrawer : PropertyDrawer...Un-dock Preview 窗口 我们可以 un-dock Preview 窗口并且将 Preview 窗口放置在任何我们想要的位置上,方法就是右击 Preview 窗口的顶部栏. ?...material 创建时自动指定 shader 通过点选 shader 然后再创建 material 的这种方式, 材质便会在创建之后自动指定 shader 为之前点选的 shader. ?...NaughtyAttributes NaughtyAttributes 项目实现了 20 多种有用的特性,例如 ReorderableList, Slider, ResizableTextArea 等等

    1.1K30

    Unity基础教程系列(七)——可配置形状(Variety of Randomness)

    当只有几个活动形状时,这不是问题,但是在处理许多形状时可能会成为性能瓶颈。 ?...(占用了很多空间) 我们还可以添加更多选项,比如控制角度旋转轴的方法,但问题是配置的检查器很快就会变得又大又笨拙。当展开时,每个浮动范围会占用三行,这是有点浪费空间。...当标签占用空间时,该方法返回一个修改后的区域,该区域为我们提供了其余UI的剩余空间。 ? ?...在绘制属性之前,Unity编辑器会检查是否存在适用于附加到其上的的drawer。如果是这样,它将使用那个。否则,它将检查是否存在适用于属性类型的drawer并使用该drawer。...接下来,我们需要知道要显示的滑块的限制,该限制存储在属性中。我们可以通过PropertyDrawer的attribute属性访问它。

    2.7K30

    Unity3D Editor自定义窗口、自定义组件学习分享

    HelpURL()提供一个自定义的文档链接,点击组件上的文档图标既能打开到你指定的链接,如下所示: 提示:填写链接时,一定要写上 http:// 或者 https://,否则将无任何反应。...那是因为进度条的最大值为1,如果不除100的话,当滑块的值为1时,进度条便填满了,因此我们想让值与进度条的比例同步,那就除100吧(语文不好,不知道解释得如何)。...对象 设置窗口的名字 如代码注释所示,利用构造函数来设置窗口的名字。...Persion类中的属性成功的显示在了Inspector面板上。...接下来让我们看看它的源码: 从源码中我们知道,它其实和上一篇的PropertyDrawer类差不多,都是继承自 GUIDrawer。

    1.9K22

    xwiki开发者指南-一分钟创建App

    有些字段类型,如标题和内容都没有被映射到XClass属性类型,而是文档字段。视觉上一个Short Text字段和Title字段之间没有差别。所不同的是值的存储方式。...) sheet,用于显示和编辑应用程序条目(如 Holiday RequestSheet) template,当创建一个新的应用程序条目,编辑时提供默认值 (如Holiday RequestTemplate...正如你可以看到这个类只有一个属性,priority,用于指定在字段配置面板的类别列表中的位置。类别标题实际上是wiki页面的标题。...假设你已经创建了 "External Image"属性类型,让我们看看如何在它的基础上添加一个字段类型。 首先你需要创建一个新的wiki页面。wiki页面的标题为新的字段类型的标题。...要做到这一点,你只需要添加的 "External Image" 属性类型, 并设置元属性的默认值。基本上,当你在应用程序中添加新的"External Image"字段时,该属性模板将被会复制。

    8.3K30

    27 个问题,告诉你Python为什么这么设计

    CPython退出时为什么不释放所有内存? 为什么有单独的元组和列表数据类型? 列表是如何在CPython中实现的? 字典是如何在CPython中实现的? 为什么字典key必须是不可变的?...相反,当阅读x.len()时,必须已经知道x是某种实现接口的容器,或者是从具有标准len()的类继承的容器。...列表如何在CPython中实现? CPython的列表实际上是可变长度的数组,而不是lisp风格的链表。该实现使用对其他对象的引用的连续数组,并在列表头结构中保留指向该数组和数组长度的指针。...这使得索引列表 a[i] 的操作成本与列表的大小或索引的值无关。 当添加或插入项时,将调整引用数组的大小。...并采用了一些巧妙的方法来提高重复添加项的性能; 当数组必须增长时,会分配一些额外的空间,以便在接下来的几次中不需要实际调整大小。 字典如何在CPython中实现?

    6.7K11

    《前端那些事》如何更好管理 Api 接口

    那么cancelToken是如何实现的,可以阅读下源码,源码链接 点我 2.支持Promise API(axios.all、axios.spread等) 应用场景:当我想同时发起多个请求时,axios.all...3.拦截器(拦截请求和返回) 应用场景:当一个项目中,多个接口需要前端通过header传用户ID、校验token等等时,我们可以统一添加,同理,当接口出现异常的状态码,如401(登录过期)需要重定向到登录页面时...如 vue-router 添加 Vue 实例方法,通过把它们添加到 Vue.prototype 上实现。...如何在项目中调用 因为已经挂载在vue对象的原型上,可以使用this.$api去调模块 ? 聊到你可能疑惑就是,你这接口路径不对啊,怎么是相对路径呢?...你看看下面这个例子应该就清楚了,如果是不可枚举则不显示,反之即可,也就是当enumerable为false,只返回给定对象的自身可枚举属性 ?

    3.4K30

    《前端那些事》如何更好管理 Api 接口

    ,如果你之前发起的请求列表还没有响应,这时候如果你重新发起请求,会出现二次请求的情况,可以通过cancelToken可以取消上一次请求 使用文档 ❞ 那么cancelToken是如何实现的,可以阅读下源码...header传用户ID、校验token等等时,我们可以统一添加,同理,当接口出现异常的状态码,如401(登录过期)需要重定向到登录页面时,我们需要统一添加处理,这时候拦截器就起到很重要的作用 ❞ image.png...如 vue-router 添加 Vue 实例方法,通过把它们添加到 Vue.prototype 上实现。(上文使用的是这种操作) 一个库,提供自己的 API,同时提供上面提到的一个或多个功能。...如何在项目中调用 因为已经挂载在vue对象的原型上,可以使用this....你看看下面这个例子应该就清楚了,如果是不可枚举则不显示,反之即可,也就是当enumerable为false,只返回给定对象的自身可枚举属性 同样的下面几种方式也是同样的思路(只返回给定对象的自身可枚举属性

    3K31

    Vue 框架学习系列十一:Vue 3 性能优化

    懒加载组件:使用Vue的异步组件和动态导入功能,实现组件的懒加载。当组件首次被请求时,它们才会被加载到内存中,从而节省初始加载时间和内存占用。.../views/Home.vue') }, // 其他路由配置... ] });这个示例展示了如何在Vue3的路由配置中使用动态import()语法来实现组件的懒加载。...当组件被需要时,它才会被加载和执行,从而提高页面加载速度。二、高效的响应式系统避免不必要的响应式数据:仅将需要响应式更新的数据标记为响应式。...使用ref或reactive时,要谨慎选择哪些数据需要被追踪变化。使用computed属性:computed属性基于其依赖的响应式数据进行缓存。...当依赖项未发生变化时,computed属性将返回缓存的值,避免不必要的计算。优化深度监听:当使用watch监听深度嵌套的对象时,要确保只监听必要的属性变化,以避免性能瓶颈。

    27410

    【JAVA-Day56】Java面向对象编程:深入理解类、对象、属性和方法的核心概念

    当定义一个类时,属性和方法是定义该类的特征和行为的关键部分。 2.2.1 属性的定义 属性代表类的状态或特征。它们描述了对象的各种特性。在Java中,属性通常被称为类的字段(Fields)。...当创建Java类并实例化对象时,需要遵循几个基本步骤。下面是一个示例,展示了如何创建一个简单的Java类以及如何实例化该类的对象。...属性和方法是类的核心元素,它们描述了对象的特征和行为。以下是如何在Java中定义属性和方法以及如何在程序中使用它们的示例代码: 定义属性 在类中,属性通常被称为字段或成员变量,它们用于存储对象的状态。...5.2 如何在Java中使用它们实现不同的行为 我们将提供示例,演示如何在Java中进行方法重载和方法重写,以满足不同的编程需求。 在Java中,方法重载和方法重写是实现不同行为的两种关键技术。...当调用Dog对象的speak方法时,将执行子类的实现。 这些示例演示了如何使用方法重载和方法重写来实现不同的行为。

    16310

    超详细】Figma组件属性完全指南

    您可以直接从属性面板中选择整个组件并在其中交换层。 何时使用实例交换属性? 当您想在另一个组件中交换组件时使用它。例如,当您有一个按钮时,您可以通过属性面板更改按钮内部的图标。 目前,无法交换变体。...如何在 Figma 中编辑属性? 整理属性 您可以通过选择组件集并从右侧菜单中拖放列表中的项目来对属性列表进行排序。 更改属性名称 有两种方法可以更改属性名称: 1....双击右侧菜单中的组件属性名称。 2. 单击详细信息图标,然后在窗口中更改名称。 更改列表中的变体顺序 当您单击一个实例并想要更改变体时,您希望它按字母顺序排列,或者最流行的变体在顶部。...在变体行上,单击详细信息图标。在打开的窗口中,拖放变体。您在此处设置的顺序是 Figma 将在列表中显示的顺序。 添加描述和链接 您可以为每个组件和变体添加描述和链接。...属性列表 如果您有一个具有布尔值和另一个属性的组件,请对属性列表进行排序,布尔值位于顶部,然后是其他属性。当您将布尔值切换为关闭时,另一个属性会消失并且列表会移动。

    12.4K22

    Flutter 流体滑块

    **我们还将在flutter应用程序中使用flutter_fluid_slider包来实现流体滑块和属性的演示程序。...它显示了具有不同颜色的三流体滑块,并为用户使用了不同的工作属性。它会显示在您的设备上。 属性 onChanged: 此属性是必需的,并且在用户开始为滑块选择新值时调用该属性。...value: 此属性是必需的,并且用于此滑块的当前选定值。在与该值相对应的位置上绘制滑块的拇指。 **min:**此属性用于用户可以选择的最小值。默认值为0.0。必须小于或等于[max]。...thumbColor: 此属性用于拇指的颜色。、如果未提供,将应用[颜色为白色]。 **onChangeStart:** 当用户开始为滑块选择新值时,将调用此属性。...onChangeEnd: 当 用户为滑块选择新值时,将调用此属性。 实现 添加依赖 将依赖项添加到pubspec.yaml文件。

    11.7K20

    干货 | 27 个问题,告诉你 Python 为什么如此设计?

    相反,当阅读 x.len()时,必须已经知道 x 是某种实现接口的容器,或者是从具有标准 len()的类继承的容器。...当没有实现映射的类有 get()或 key()方法,或者不是文件的类有 write()方法时,我们偶尔会感到困惑。...列表如何在 CPython 中实现? CPython 的列表实际上是可变长度的数组,而不是 lisp 风格的链表。...该实现使用对其他对象的引用的连续数组,并在列表头结构中保留指向该数组和数组长度的指针。 这使得索引列表 a[i] 的操作成本与列表的大小或索引的值无关。 当添加或插入项时,将调整引用数组的大小。...并采用了一些巧妙的方法来提高重复添加项的性能; 当数组必须增长时,会分配一些额外的空间,以便在接下来的几次中不需要实际调整大小。 19. 字典如何在 CPython 中实现?

    2.7K10

    Python 核心设计理念27个问题及解答

    相反,当阅读 x.len()时,必须已经知道 x 是某种实现接口的容器,或者是从具有标准 len()的类继承的容器。...当没有实现映射的类有 get()或 key()方法,或者不是文件的类有 write()方法时,我们偶尔会感到困惑。...列表如何在 CPython 中实现? CPython 的列表实际上是可变长度的数组,而不是 lisp 风格的链表。...该实现使用对其他对象的引用的连续数组,并在列表头结构中保留指向该数组和数组长度的指针。 这使得索引列表 a[i] 的操作成本与列表的大小或索引的值无关。 当添加或插入项时,将调整引用数组的大小。...并采用了一些巧妙的方法来提高重复添加项的性能; 当数组必须增长时,会分配一些额外的空间,以便在接下来的几次中不需要实际调整大小。 19. 字典如何在 CPython 中实现?

    3.4K21

    Python官方二十七问,你知道个啥?

    相反,当阅读 x.len()时,必须已经知道 x 是某种实现接口的容器,或者是从具有标准 len()的类继承的容器。...当没有实现映射的类有 get()或 key()方法,或者不是文件的类有 write()方法时,我们偶尔会感到困惑。...列表如何在 CPython 中实现? CPython 的列表实际上是可变长度的数组,而不是 lisp 风格的链表。...该实现使用对其他对象的引用的连续数组,并在列表头结构中保留指向该数组和数组长度的指针。 这使得索引列表 a[i] 的操作成本与列表的大小或索引的值无关。 当添加或插入项时,将调整引用数组的大小。...并采用了一些巧妙的方法来提高重复添加项的性能; 当数组必须增长时,会分配一些额外的空间,以便在接下来的几次中不需要实际调整大小。 19. 字典如何在 CPython 中实现?

    2.5K20

    干货 | 27 个问题,告诉你 Python 为什么如此设计?

    相反,当阅读 x.len()时,必须已经知道 x 是某种实现接口的容器,或者是从具有标准 len()的类继承的容器。...当没有实现映射的类有 get()或 key()方法,或者不是文件的类有 write()方法时,我们偶尔会感到困惑。...列表如何在 CPython 中实现? CPython 的列表实际上是可变长度的数组,而不是 lisp 风格的链表。...该实现使用对其他对象的引用的连续数组,并在列表头结构中保留指向该数组和数组长度的指针。 这使得索引列表 a[i] 的操作成本与列表的大小或索引的值无关。 当添加或插入项时,将调整引用数组的大小。...并采用了一些巧妙的方法来提高重复添加项的性能; 当数组必须增长时,会分配一些额外的空间,以便在接下来的几次中不需要实际调整大小。 19. 字典如何在 CPython 中实现?

    2.6K20

    27 个问题,告诉你Python为什么这么设计?

    相反,当阅读x.len()时,必须已经知道x是某种实现接口的容器,或者是从具有标准len()的类继承的容器。...当没有实现映射的类有get()或key()方法,或者不是文件的类有write()方法时,我们偶尔会感到困惑。...列表如何在CPython中实现? CPython的列表实际上是可变长度的数组,而不是lisp风格的链表。该实现使用对其他对象的引用的连续数组,并在列表头结构中保留指向该数组和数组长度的指针。...这使得索引列表 a[i] 的操作成本与列表的大小或索引的值无关。 当添加或插入项时,将调整引用数组的大小。...并采用了一些巧妙的方法来提高重复添加项的性能; 当数组必须增长时,会分配一些额外的空间,以便在接下来的几次中不需要实际调整大小。 字典如何在CPython中实现?

    3.1K20

    如何实现所见即所得编辑器?tiptap的实现原理(二)

    Tiptap 的 Core 模块使用 ProseMirror 的插件系统来实现扩展功能,如撤销和重做、拖放和粘贴等。 基本上,可以理解为 是 ProseMirror的那套把戏。...我们如何在TipTap 上去实现一个扩展(Extension),以及扩展的实现原理 在 Tiptap 中,插件的各种能力(如快捷键、命令等)是通过扩展(Extension)的 API 实现的。...inputRules 是一种基于输入模式的快捷键,例如在输入 * 和空格时自动创建一个列表。keymap 是一种基于按键组合的快捷键,例如按 Ctrl+B 时切换加粗样式。...菜单项:在扩展中定义 menuItems 属性,可以添加菜单项。菜单项是一个对象,包含一些属性,如 command、icon 和 title 等。当用户点击菜单项时,编辑器会自动调用相应的命令。...可以看到主要的逻辑是,当触发快捷键,时,会给选择的文本增加 ** **,再次触发,会去掉选中。

    4.4K72

    用Publish创建博客(二)——主题开发

    当使用Plot时,你通常不需要与这个类型进行交互,基础Node中会创建它的实例。•Attribute表示附加在元素上的属性,例如元素的 href,或者 元素的 src。...属性 属性的应用方式也可以和添加子元素的方式完全一样,只需在元素的逗号分隔的内容列表中添加另一个条目即可。例如,下面是如何定义一个同时具有CSS类和URL的锚元素。...Plot的所有元素和属性都是作为上下文绑定的节点来实现的,这既能强制执行有效的HTML语义,也能让Xcode和其他IDE在使用Plot的DSL编写代码时提供丰富的自动补全信息。...Item列表•makeSectionHTML(for section: Section,context: PublishingContext)当Section作为Item容器时的页面...Pipeline的末段,通常情况下,当主题方法调用给定的数据时,数据已经是准备好的。

    1.2K20
    领券