首页
学习
活动
专区
工具
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.8K22

    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,只返回给定对象的自身可枚举属性 同样的下面几种方式也是同样的思路(只返回给定对象的自身可枚举属性

    2.9K31

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

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

    11.7K22

    Flutter 流体滑块

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

    11.6K20

    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.7K10

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

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

    3.3K21

    干货 | 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

    Android Studio preview 不固定及常见问题的解决办法

    Android Studio提供了一个强大的“Preview”工具,可以帮助您预览您的布局文件将如何在用户的设备呈现。XML布局可能Android开发中最常用的资源。...它还允许您查看布局的不同配置,例如在纵向或横向的外观,或者TextView在多个语言环境(英语,德语或希腊语)的外观。...操作 这里最常见的关于Preview的问题列表和解决方案(图片请右键用新标签放大查看): 问题1:Preview看起来为空 假设你有一个布局,其内容将从后端获得的数据填充…你很快意识到,由于内容动态的...这是处理动态内容的常见问题。即使代码编译没有问题,没有人可以在不查看XML代码的情况下理解该布局。 创建使用任何后端数据相关视图的布局,一个好的做法仅在预览填充它。...问题2:测试最大宽高 或者您的布局旨在显示来自外部源的一些内容,它有时被要求具有一些最大宽度或/和高度(也就是使用了maxHeight属性),来确保您的布局看起来美观,即使外部源发送大于预期或某些宽高比未被同意的图像

    3.7K30

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

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

    3.7K71

    03.HTML头部CSS图像表格列表

    元素: 定义了浏览器工具栏的标题 网页添加到收藏夹,显示在收藏夹中的标题 显示在搜索引擎结果页面的标题 一个简单的 HTML 文档: 实例 HTML 元素 ...内联样式 特殊的样式需要应用到个别元素,就可以使用内联样式。 使用内联样式的方法在相关的标签中使用样式属性。样式属性可以包含任何 CSS 属性。以下实例显示出如何改变段落的颜色和左外边距。...内部样式表 单个文件需要特别样式,就可以使用内部样式表。你可以在 部分通过 标签定义内部样式表: 外部样式表 样式需要被应用到很多页面的时候,外部样式表将是理想的选择。...HTML 图像- Alt属性 alt 属性用来为图像定义一串预备的可替换的文本。 替换文本属性的值用户定义的。 在浏览器无法载入图像,替换文本属性告诉读者她们失去的信息。...加载图片需要时间的,所以我们的建议:慎用图片。 注意: 加载页面,要注意插入页面图像的路径,如果不能正确设置图像的位置,浏览器无法加载图片,图像标签就会显示一个破碎的图片。

    19.4K101

    用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
    领券