Unity 2D拖放问题iDropHandler

时间:2019-01-09 09:16:13

标签: unity3d drag-and-drop

我有一个实现IBeginDragHandler,IDragHandler,IEndDragHandler的可拖动游戏对象(砖)

我还有另一个游戏对象(插槽),可以将砖块放到实现IDropHandler的地方

快速浏览Bricks的OnBeginDrag方法:

public static GameObject itemBeingDragged;
Vector3 startPosition;
Transform startParent;

public void OnBeginDrag(PointerEventData eventData)
{
    itemBeingDragged = gameObject;
    startPosition = transform.position;
    startParent = transform.parent;
    GetComponent<CanvasGroup>().blocksRaycasts = false;
    GetComponent<BoxCollider2D>().enabled = false;



}

当我将积木放到插槽中时,积木会假设该插槽为父级,并且也假定插槽位置,就像在IDropHandler的OnDrop方法代码中一样:

public void OnDrop(PointerEventData eventData)
    {
            DragHandler.itemBeingDragged.transform.SetParent(transform);
            DragHandler.itemBeingDragged.transform.position = transform.position;
    }

问题是当我拖放砖块时,我希望砖块的位置略有偏移(例如,在手机上,这样在拖动砖块时,手指不会在视觉上隐藏砖块)

因此,在Bricks OnDrag代码中,我具有类似的功能以提供视觉偏移:

public void OnDrag(PointerEventData eventData)
{

    Vector3 offset = new Vector3(0, 100, 0);
    transform.position = Input.mousePosition + offset;


}

我知道上面是关于鼠标位置的,但最终我希望它是触摸位置。

在拖动时看起来不错,但是,将其放在插槽上时,似乎仅当鼠标指针在插槽上方时才调用插槽的OnDrop方法,而当砖块在插槽上方时才调用。意思是当砖在插槽上方时释放阻力时,不会调用OnDrop。仅当我以将鼠标指针放在插槽内的方式释放插槽外的砖块时才调用它。有道理吗?

有没有一种方法可以使OnDrop使用砖块位置而不是鼠标位置?

谢谢 凯文

1 个答案:

答案 0 :(得分:0)

这最终是一种hack,这正是我喜欢对指针向下/向上事件进行自己的拖放逻辑的原因,但是无论如何:将视觉效果作为附加了积木脚本的游戏对象的子代,然后在拖动开始时仅将视觉效果向上移动。拖动完成后,将视觉效果移回原位。

顺便说一句,您在看起来像SetParent(transform)的地方使用RectTransform。通常,您希望将SetParent(transform, false)与rect转换一起使用,因为否则,您将弄乱布局系统,并且仍然失去rect转换的好处。