GameObject 在 OnDrag 期间消失

GameObject disappears during OnDrag

我有一个主要基于 this tutorial 的库存系统,我目前正在修改它。 OnBeginDragOnEndDrag 按预期工作,但 OnDrag 虽然不断更新项目的位置,但不显示项目。它会在 OnDrag 期间消失,并在将其放入新位置后重新出现。

这是我的层次结构:

值得注意的是两个摄像头。据我所知,DungeonGroup(和 DungeonUICanvas)使用 DungeonCamera。 (直到最近,DungeonGroup 还是一个完全不同的场景。OnDrag 在我整合场景之前按预期工作,让我认为相机问题 可能 罪魁祸首。)

这是我目前正在使用的代码:

public class DragHandler : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
    public static GameObject item; //itemBeingDragged
    public static Vector3 startPosition;
    public static Transform startParent;

    public void OnBeginDrag(PointerEventData eventData)
    {
        item = gameObject;
        startPosition = transform.position;
        startParent = transform.parent;

        GetComponent<CanvasGroup>().blocksRaycasts = false;

        transform.SetParent(transform.root);
    }

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

    public void OnEndDrag(PointerEventData eventData)
    {
        item = null;

        if (transform.parent == startParent || transform.parent == transform.root)
        {
            transform.position = startPosition;
            transform.SetParent(startParent);
        }

        GetComponent<CanvasGroup>().blocksRaycasts = true;
    }
}

Canvas 与 WorldSpace 对象的工作方式略有不同。从 Unity 的 UICanvas documentation 中可以看出:

UI elements in the Canvas are drawn in the same order they appear in the Hierarchy. The first child is drawn first, the second child next, and so on. If two UI elements overlap, the later one will appear on top of the earlier one.

当您将转换移动到根目录时,您是在 UI 层次结构中将对象向上移动,导致它成为 "drawn first"。因为它先被绘制,所有其他元素都被绘制在它前面,使它成为 "disappear"。我的建议是将 .SetParent 设置为透明的 UI 游戏对象,而不是根目录。