我正在 Unity 中构建一个自定义节点编辑器窗口,并且我查看了各种资源,例如用于构建GUI.Box
节点窗口的资源。
这很好用,我可以按照我想要的方式拖动这些窗口,但是一旦我将控件添加到GUI.Box
,我希望它们覆盖Drag()
我编写的函数。
这是问题的一个示例 - 当我向上移动垂直滑块时,整个框都会随之拖动。
有没有办法使用 修复这种行为GUI.Box
,或者我应该回到GUI.Window
它的内置GUI.DragWindow()
?
这是我正在使用的代码的简化版本:
EditorMouseInput.cs:
private bool ActionLeftMouseDown()
{
mouseDownNode = editor.GetSelectedNode(Input.current.mousePosition);
if (mouseDownNode == null)
editor.StartMovingEditorCanvas();
else
mouseDownNode.IsSelected = true;
}
BaseNodeEditor.cs:
public BaseNode GetSelectedNode(Vector2 mousePos)
{
foreach (BaseNode node in Nodes)
{
if (node.WindowRect.Contains(mousePos))
return node;
}
return null;
}
public void Drag(Vector2 delta)
{
if (!MoveEditorMode && !ConnectionMode)
{
foreach (BaseNode node in Nodes)
{
node.Drag(delta);
}
}
BaseNode.cs:
public void Drag(Vector2 delta)
{
if (IsSelected)
draggedDistance += delta;
}
垂直滑块添加到派生的 JumpNode 类中。构造滑块的辅助类的摘录:
Vector2 pos = node.WindowRect.position + rect.position * GridSpacing;
value = GUI.VerticalSlider(new Rect(pos, rect.size * GridSpacing), value, maxValue, minValue);
我明白为什么这不能满足我的要求,但我不知道如何去做,因为 GUI 控件不是 GUI.Box 的一部分。
任何帮助或建议,甚至是对另一个来源的轻推都将不胜感激 - 我觉得我已经使用了我脑海中存在的所有搜索词!
编辑 - 已解决:感谢 Kleber 为我解决了这个问题。万一其他人遇到这个或类似的问题,我的解决方案是意识到 GUI 控件会自动消耗鼠标左键事件,因此单击滑块意味着没有传播到 Box 以检查它是否被单击。
我需要做的是将 Node 类中的 IsSelected 和 IsDragged 标志分开,并在 mouseUp 上清除 IsDragged。我最初使用 IsSelected 来标记启用和选中的拖动(可以一次选择和拖动多个节点)。