在 Unity3D 中,Drop 事件未使用 IDropHandler 触发

Cés*_*che 3 c# drag-and-drop unity-game-engine

我有 2 个预制对象,包含在一个带有 UI.Text 的面板中。一个包含用于拖动的类,另一个包含用于放置的类。然而,即使拖动工作正常,OnDrop() 函数也永远不会执行。我还在添加到主 Canvas 的 CanvasGroup 中将 blockRaycasts 设置为 false。

 GetComponentInParent<CanvasGroup>().blocksRaycasts = false;
Run Code Online (Sandbox Code Playgroud)

当我将对象拖入其中时,从接口 UnityEngine.EventSystems.IDropHandler 实现的方法 OnDrop() 可能无法触发,是否有任何原因?

public class ItemDropHandler : MonoBehaviour, IDropHandler
{
    public void OnDrop(PointerEventData eventData)
    {
        Debug.Log("Drop detected over the UI.Text"); //this is never shown
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 5

该问题可能是由于以下事实引起的:您将 CanvasGroup 添加到 MainCanvas,然后将完整 MainCanvas 本身的blocksRaycast 设置为 false。所以基本上你的所有输入都会通过你的画布,没有任何效果。

问题的解决方案:

  1. 删除主画布的画布组
  2. 将 Canvas-Group-Component 添加到要拖动的 Prefab 或 GameObject
  3. 然后您可以使用 CanvasGroup 的 GetComponent 来更改 OnBeginDrag(...) 中的blocksRaycast-属性
  4. 不要忘记在 OnEndDrag(...) 中将blocksRaycast-property设置为true以使其再次可拖动

以下是 DragHandler 的一些示例代码:

public class DragHandler : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
    public void OnBeginDrag(PointerEventData eventData)
    {
        Debug.Log("OnBeginDrag");
        GetComponent<CanvasGroup>().blocksRaycasts = false;
    }

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

    public void OnEndDrag(PointerEventData eventData)
    {
        GetComponent<CanvasGroup>().blocksRaycasts = true;
        Debug.Log("OnEndDrag");
    }
}
Run Code Online (Sandbox Code Playgroud)