关闭

Unity ReorderableList 可重新排序的列表框使用

标签: unity
5271人阅读 评论(1) 收藏 举报
分类:

可重新排序的列表框

Unity 编辑器内部命名空间有个类 ReorderableList,可以实现通过拖曳来达到列表元素的重新排序,效果如下图所示:
)

基本使用

创建一个测试工程,新建一个脚本文件TestList.cs,代码如下:

using UnityEngine;
using System.Collections.Generic;

public class TestList : MonoBehaviour
{
    public List<string> names = new List<string>();
}

新建一个编辑器脚本文件TestListInspector.cs,代码如下:

using UnityEditor;
using UnityEditorInternal;
using UnityEngine;

[CustomEditor(typeof(TestList))]
public class TestListInspector : Editor 
{
    private ReorderableList m_NameList;

    private void OnEnable()
    {
        m_NameList = new ReorderableList(serializedObject,
            serializedObject.FindProperty("names"),
            true, true, true, true);
    }

    public override void OnInspectorGUI()
    {
        serializedObject.Update();
        m_NameList.DoLayoutList();
        serializedObject.ApplyModifiedProperties();
    }
}

附加脚本到物体上,检视器效果如下图所示:
这里写图片描述
可以看到列表元素并没有被绘制出来,也不能进行改动。绘制列表元素需要我们自定义如何绘制,在OnEnable函数里面,添加如下代码:

m_NameList.drawElementCallback = DrawNameElement;

添加如下函数:

    private void DrawNameElement(Rect rect, int index, bool selected, bool focused)
    {
        SerializedProperty itemData = m_NameList.serializedProperty.GetArrayElementAtIndex(index);

        rect.y += 2;
        rect.height = EditorGUIUtility.singleLineHeight;
        EditorGUI.PropertyField(rect, itemData, GUIContent.none);
    }

效果如下图所示:
这里写图片描述
列表表头显示 Serialized Property,我们将其改成所想要提示的内容。在OnEnable函数里面,添加如下代码:

m_NameList.drawHeaderCallback = (Rect rect) =>
{
    GUI.Label(rect, "Names");
};

效果如下图所示:
这里写图片描述

进阶使用

移除时的警告

在删除元素时,弹出警告对话框,确定之后才能真正删除。在OnEnable函数里面,添加如下代码:

m_NameList.onRemoveCallback = (ReorderableList list) =>
{
    if (EditorUtility.DisplayDialog("警告", "是否真的要删除这个名称?", "是", "否"))
    {
        ReorderableList.defaultBehaviours.DoRemoveButton(list);
    }
};

删除功能调用的是ReorderableList默认行为里的删除功能。效果如下图所示:
这里写图片描述

更改添加时的默认值

每次添加新元素时,总是会复制最后一个元素。这里更改其规则,在OnEnable函数里面,添加如下代码:

m_NameList.onAddCallback = (ReorderableList list) =>
{
    if (list.serializedProperty != null)
    {
        list.serializedProperty.arraySize++;
        list.index = list.serializedProperty.arraySize - 1;

        SerializedProperty itemData = list.serializedProperty.GetArrayElementAtIndex(list.index);
        itemData.stringValue = "默认值";
    }
    else
    {
        ReorderableList.defaultBehaviours.DoAddButton(list);
    }
};

效果如下图所示:
这里写图片描述

API 文档

构造函数

ReorderableList(
  SerializedObject serializedObject,
  SerializedProperty elements,
  bool draggable,
  bool displayHeader,
  bool displayAddButton,
  bool displayRemoveButton
)

变量

名称 描述
draggable 拖曳排序
displayAdd 显示添加按钮
displayRemove 显示移除按钮
elementHeight 元素高度
headerHeight 表头高度
footerHeight 尾部高度
showDefaultBackground 显示默认背景

公有方法

名称 描述
DoLayoutList 自动布局绘制列表
DoList(Rect rect) 指定区域绘制列表
GetHeight 获取绘制列表总高度

委托

名称 描述
drawHeaderCallback 绘制表头回调
drawFooterCallback 绘制尾部回调
drawElementCallback 绘制元素回调
drawElementBackgroundCallback 绘制元素背景回调
onReorderCallback 重新排序回调
onSelectCallback 选中回调
onAddCallback 添加按钮回调
onAddDropdownCallback 添加下拉选项回调
onRemoveCallback 移除元素回调
onMouseUpCallback 鼠标抬起回调
onCanRemoveCallback 是否显示可移除按钮回调
onChangedCallback 列表改变回调

扩展资料

  1. Unity: make your lists functional with ReorderableList http://va.lent.in/unity-make-your-lists-functional-with-reorderablelist/
2
0
查看评论

ReorderableList

http://va.lent.in/unity-make-your-lists-functional-with-reorderablelist/
  • sgnyyy
  • sgnyyy
  • 2017-05-23 23:54
  • 294

【Unity】编辑器小教程

写在前面Unity最强大的地方之一是它扩展性非常强的编辑器。Unite Europe 2016上有一个视频专门讲编辑器编程的: https://www.youtube.com/watch?v=9bHzTDIJX_Q 这里大概记录一下里面的关键点。场景一关注点: 绘制重要区域,Gizmos.DrawX...
  • candycat1992
  • candycat1992
  • 2016-08-04 19:37
  • 12508

【Unity】多边形雷达图

多边形雷达图作为游戏中直观体现角色各项数值的UI在许多游戏中得到应用。目前关于unity中实现雷达图的方式的教程有很多,这里提供一种UGUI实现方案,主要有以下功能: 1.支持3边以上的任意多边形。 2.使用PropertyDrawer扩展了Inspector面板,方便调节 3.支持点击穿透判定...
  • mobilebbki399
  • mobilebbki399
  • 2017-10-26 22:13
  • 395

Unity Editor 编辑器扩展 十一 Inspector可排序列表

目录可排序列表简单使用可排序列表简单使用创建如下脚本并挂载到物体上:using UnityEngine; using System.Collections;public class Example1 : MonoBehaviour { [SerializeField] string[]...
  • WarrenMondeville
  • WarrenMondeville
  • 2016-12-22 02:55
  • 989

【unity拓展】使列表支持拖动排序(Reorderablelist)

详情见博客:http://va.lent.in/unity-make-your-lists-functional-with-reorderablelist/
  • egostudio
  • egostudio
  • 2016-07-06 13:36
  • 453

Unity Editor 基础篇(三):自定义窗口

本文参自:http://mp.weixin.qq.com/s/tMSAIND4Pq0farn2jY8rwg本文为本人学习上连接的笔记有改动,请点击以上链接查看原文,尊重楼主知识产权。Unity Editor自定义窗口目标: 1.了解一些属性的使用 2.创建一个自定义窗口 最终目标: 利用学到...
  • qq_33337811
  • qq_33337811
  • 2017-03-15 15:50
  • 7104

利用UnityEditor实现自己的代码生成器

在写了不少代码之后,才发现以前写的很多代码都是重复性的,虽然这样的重复劳动让程序员形成了自己的代码风格,但一直这样下去并不是十分明智的方式。 -----------------------------------------------------写在前面 本文将利用unity的编辑器扩展功能,...
  • tankerhunter
  • tankerhunter
  • 2017-04-11 19:20
  • 1121

Unity扩展Editor菜单:提供一个统一的接口,来让策划调节prefab里相关脚本的数值

扩展Editor的目的:提供一个统一的接口,来让策划调节prefab里相关脚本的数值,避免策划直接调整数值时不小心修改了prefab里其他组件的设置  思路:  1、创建1个EditorWindow  2、Project里选择相应的目录或者文件,处理得到目录D...
  • Steven_2017
  • Steven_2017
  • 2017-06-29 16:24
  • 424

unity UI自动排列并可滑动查看

在使用unity的过程中,经常需要制作可滑动的界面,之前由于应用需要有一个阅读说明书的功能,所以编辑了一个可以滑动查看文字的界面,并且在手机上滑动相关区域也可以实现滑动查看的功能。当时因为比较忙所以没有写下教程。这次也是需要制作一个可滑动查看的界面,还增加了自动排列的功能,制作的过程中发现这一教程很...
  • SunnyInCSDN
  • SunnyInCSDN
  • 2017-04-27 16:59
  • 1596

Unity系列——UGUI创建滑动列表tableview

UGUI创建滑动列表步骤 1、创建一个panel,命名moveLayer,添加mask组件进行遮罩裁剪,添加scrollRect进行滑动。 2、为moveLayer创建一个容器也是panel,为容器命名content,在容器content里面添加layout组件,并把content设置到scroll...
  • u012071200
  • u012071200
  • 2016-09-06 20:10
  • 6572
    个人资料
    • 访问:3549536次
    • 积分:36051
    • 等级:
    • 排名:第137名
    • 原创:402篇
    • 转载:88篇
    • 译文:5篇
    • 评论:3424条
    个人说明
    联系方式:
    文章存档
    最新评论