unity插件odin怎么使OdinMenuEditorWindow中的列表项可拖动,改变顺序
时间: 2024-03-09 22:44:54 浏览: 244
要使OdinMenuEditorWindow中的列表项可拖动,改变顺序,你需要为列表项定义一个DragHandle()方法,用来处理鼠标拖动事件,并在OnGUI()方法中调用该方法。具体实现步骤如下:
1. 为列表项定义一个DragHandle()方法,用来处理鼠标拖动事件。该方法需要定义一个Rect类型的参数,表示列表项的位置和大小。代码如下:
```csharp
private void DragHandle(Rect rect)
{
EditorGUIUtility.AddCursorRect(rect, MouseCursor.Pan);
if (Event.current.type == EventType.MouseDown && Event.current.button == 0 && rect.Contains(Event.current.mousePosition))
{
GUIUtility.hotControl = GUIUtility.GetControlID(FocusType.Passive);
draggingIndex = index;
}
if (Event.current.type == EventType.MouseDrag && GUIUtility.hotControl == GUIUtility.GetControlID(FocusType.Passive) && draggingIndex == index)
{
var dragDelta = Event.current.delta.y;
if (dragDelta > 0f && index < items.Count - 1)
{
items.Swap(index, index + 1);
draggingIndex += 1;
}
else if (dragDelta < 0f && index > 0)
{
items.Swap(index, index - 1);
draggingIndex -= 1;
}
GUI.changed = true;
}
if (Event.current.type == EventType.MouseUp && Event.current.button == 0 && GUIUtility.hotControl == GUIUtility.GetControlID(FocusType.Passive))
{
GUIUtility.hotControl = 0;
draggingIndex = -1;
}
}
```
在这里,我们首先使用EditorGUIUtility.AddCursorRect()方法为列表项添加一个鼠标拖动的手柄,然后处理鼠标拖动事件。在MouseDown事件中,如果检测到鼠标左键按下,并且鼠标位置在列表项内,就记录下当前拖动的列表项的索引。在MouseDrag事件中,如果当前拖动的列表项的索引与当前列表项的索引相等,就根据鼠标拖动的距离改变列表项的顺序。最后在MouseUp事件中,清除拖动状态。
2. 在OnGUI()方法中调用DragHandle()方法,为列表项添加可拖动的手柄。代码如下:
```csharp
for (int i = 0; i < items.Count; i++)
{
var item = items[i];
var rect = GUILayoutUtility.GetRect(GUIContent.none, GUIStyle.none, GUILayout.Height(20f), GUILayout.ExpandWidth(true));
DragHandle(rect);
// ...
}
```
在这里,我们首先获取当前列表项的位置和大小,然后调用DragHandle()方法为列表项添加可拖动的手柄。
3. 运行代码,你会发现OdinMenuEditorWindow中的列表项可以被拖动,改变顺序了。
希望我的回答能够帮到你!
阅读全文