0

我有一个主要基于本教程的库存系统,我目前正在修改它。 OnBeginDrag并按OnEndDrag预期工作,但是OnDrag,虽然不断更新项目的位置,但不显示项目。它在 期间消失OnDrag,并在它被放入新插槽后重新出现。

这是我的层次结构:

统一层次结构

值得注意的是两台相机。据我所知, DungeonGroup(和DungeonUICanvas)使用。DungeonCameraDungeonGroup直到最近,还是一个完全不同的场景。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;
    }
}
4

1 回答 1

1

Canvas 的工作方式与 WorldSpace 对象略有不同。从 Unity 的UICanvas 文档中它指出:

画布中的 UI 元素的绘制顺序与它们在层次结构中出现的顺序相同。首先绘制第一个孩子,然后绘制第二个孩子,依此类推。如果两个 UI 元素重叠,则后面的元素将出现在前面的元素之上。

当您将变换移动到根时,您将对象在 UI 层次结构中向上移动,导致它“首先绘制”。由于它是先绘制的,所以所有其他元素都绘制在它的前面,使其“消失”。我的建议是将 .SetParent 设置为层次结构中更靠下的透明 UI 游戏对象,而不是根。

于 2019-08-20T16:08:39.720 回答