首页 > 解决方案 > 如何在 Unity 中获取鼠标下方的 UI 对象?

问题描述

我目前正在尝试制作一个拖放系统,其中我有一个可以放置在其他对象上的可拖动 UI 对象。但我不知道如何获得鼠标下方的 UI 对象和可拖动的 UI 对象。

这是我的可拖动对象的代码:

using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class DragHandeler : MonoBehaviour, IBeginDragHandler, IDragHandler, 
IEndDragHandler
{
  public Transform parentToReturnTo = null;
  public Transform placeHolderParent = null;


  public void OnBeginDrag(PointerEventData eventData)
  {
      parentToReturnTo = transform.parent;
  }

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

  }

  public void OnEndDrag(PointerEventData eventData)
  {
      transform.position = parentToReturnTo.position;
  }
}

以及我的占位符的代码:

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.EventSystems;
 public class PlaceHolder : MonoBehaviour, IDropHandler, 
 IPointerEnterHandler, IPointerExitHandler
 {
    public void OnPointerEnter(PointerEventData eventData)
    {
         Transform test = eventData.pointerDrag.GetComponent<Transform>();
        Debug.Log(test.name);
    }

    public void OnPointerExit(PointerEventData eventData)
    {
    }

    public void OnDrop(PointerEventData eventData)
   {
   }
}

问题是 OnPointerEnter 函数并不总是在应该调用的时候调用,它只是在我用鼠标悬停在对象上时才会调用它。是否有其他方法可以让我将当前对象置于可拖动对象下方?

标签: c#unity3d

解决方案


因此,问题在于您的“可拖动”阻止了该对象后面任何对象的光线投射,因此 - 您的 PlaceHolder 不会触发任何事件,因为光线总是被您的“可拖动”阻止。最简单的解决方案是在拖动开始时禁用raycastTarget属性并在拖动结束时重新启用它。

using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class DragHandeler : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
  public Transform parentToReturnTo = null;
  public Transform placeHolderParent = null;

  public void OnBeginDrag(PointerEventData eventData)
  {
      // disable 'raycast target' for your draggable object
      GetComponent<Image>().raycastTarget = false;

      parentToReturnTo = transform.parent;
  }

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

  public void OnEndDrag(PointerEventData eventData)
  {
      // enable it back when drag is over
      GetComponent<Image>().raycastTarget = true;

      transform.position = parentToReturnTo.position;
  }
}

推荐阅读