unity odin插件中window编辑器界面中使用ReorderableList
时间: 2024-03-09 07:44:59 浏览: 168
unity游戏序列化编辑器插件Odin - Inspector and Serializer v3.0.3
5星 · 资源好评率100%
在Odin插件中,使用ReorderableList可以实现可拖动的列表,方便对数组或列表进行排序。具体实现步骤如下:
1. 引入命名空间
```csharp
using Sirenix.Utilities.Editor;
```
2. 定义一个ReorderableList变量
```csharp
private ReorderableList list;
```
3. 在构造函数中初始化ReorderableList
```csharp
public MyEditorWindow()
{
// ...
list = new ReorderableList(myList, typeof(MyType), true, true, true, true);
list.drawHeaderCallback += DrawHeader;
list.drawElementCallback += DrawElement;
list.onAddCallback += AddItem;
list.onRemoveCallback += RemoveItem;
}
```
在这里,我们首先定义一个ReorderableList变量,然后在构造函数中初始化该变量。其中,myList是一个MyType类型的List,表示我们要对该列表进行排序。第二个参数typeof(MyType)表示列表中的元素类型是MyType类型。接下来的4个bool参数分别表示:是否可以拖动元素、是否可以插入元素、是否可以删除元素以及是否可以多选元素。最后,我们为ReorderableList的4个事件回调分别添加对应的回调方法,用于自定义列表的行为。
4. 实现ReorderableList的4个回调方法:
```csharp
private void DrawHeader(Rect rect)
{
EditorGUI.LabelField(rect, "My List");
}
private void DrawElement(Rect rect, int index, bool isActive, bool isFocused)
{
var item = myList[index];
EditorGUI.BeginChangeCheck();
item = (MyType)EditorGUI.ObjectField(rect, item, typeof(MyType), true);
if (EditorGUI.EndChangeCheck())
{
myList[index] = item;
}
}
private void AddItem(ReorderableList list)
{
myList.Add(null);
}
private void RemoveItem(ReorderableList list)
{
myList.RemoveAt(list.index);
}
```
在这里,我们分别实现了DrawHeader()、DrawElement()、AddItem()和RemoveItem()方法。其中,DrawHeader()方法用于绘制列表的标题,DrawElement()方法用于绘制列表中的元素,AddItem()和RemoveItem()方法分别用于添加和删除元素。在DrawElement()方法中,我们使用ObjectField来绘制列表项,并在ObjectField的值发生变化时,更新列表中对应元素的值。
5. 在OnGUI()方法中绘制ReorderableList
```csharp
public void OnGUI()
{
// ...
list.DoLayoutList();
}
```
在这里,我们在OnGUI()方法中调用ReorderableList的DoLayoutList()方法,用于绘制整个ReorderableList。
6. 运行代码,你会发现ReorderableList已经可以实现可拖动的列表了。
希望我的回答能够帮到你!
阅读全文