【问题标题】:Unity 2D drag and drop issue iDropHandlerUnity 2D 拖放问题 iDropHandler
【发布时间】:2019-01-09 09:16:13
【问题描述】:

我有一个实现 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 在砖块位置而不是鼠标位置上工作?

谢谢 凯文

【问题讨论】:

    标签: unity3d drag-and-drop


    【解决方案1】:

    这最终是一个 hack,这正是我喜欢使用指针向下/向上事件执行我自己的拖放逻辑的原因,但无论如何:使视觉对象成为游戏对象的子对象,并附加砖块脚本,然后在拖动开始时仅向上移动视觉对象。拖动完成后,将视觉对象移回原位。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-09
      相关资源
      最近更新 更多