将 UI 元素置于前台

Bring a UI Element to foreground

我想实现简单的拖放

public void OnDrag (PointerEventData eventData)
{
    transform.position = eventData.position;
}

问题是,当我开始拖动时,我想将 UI 元素 带到 前景。通过做这样的事情:

public void OnBeginDrag (PointerEventData eventData)
{
    transform.SetParent (transform.parent);    // giving the parent transform or a transform of an element on top
}

这显然不是一个通用的解决方案。所以我有一个问题。关于如何制作 UI 元素 topmost 是否有 elegant 方法?

是的,如果您使用的是 Unity GUI 系统,您可以使用 GUI.depth 创建某种图层。

GUI elements drawn with lower depth values will appear on top of elements with higher values (ie, you can think of the depth as "distance" from the camera).

这是一个例子:

function OnGUI() {
    GUI.depth = 1; // You set to 1 by default
    if(GUI.RepeatButton(Rect(0,0,100,100), "My Button")) {
        GUI.depth = 0; // When the button is clicked, Depth is set to 0 the button is on top 
    }
}

就我而言,我通常使用 NGUI,它非常高效且经过优化,允许您处理拖放操作。

但是,如果您不使用 Unity GUI(如果您使用游戏对象)并且不想使用插件,则需要开发自己的系统。 达到预期效果的更简单方法是:

  • 首先您需要有一个 orthographic camera 用于拖放元素。您应该相应地调整相机的图层。

Orthographic : Camera will render objects uniformly, with no sense of perspective.

  • 然后,OnDrag您应该将物体移近相机。这样,它就会显得最近。
  • 最后,OnDrop,您应该将对象 Z 位置重置为与相机的距离与任何其他对象的距离相同。

我实际上找到了一个相当简单的解决方案。将 UI Element transform 设置为:

transform.SetParent(transform.root);

UI Element 被放置为 Canvasfirst child,从而有效地将自己置于 前景