如何在Unity中的鼠标下方获取UI对象?

时间:2018-09-08 12:36:00

标签: c# unity3d

我目前正在尝试创建一个拖放系统,其中有一个可拖动的UI对象,可以将其放置在另一个对象上。但是我不知道如何将UI对象放在鼠标和可拖动UI对象的下方。

这是我的dragableObject的代码:

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函数并非总是在应有的时候被调用,它仅在我用鼠标悬停在对象上方时才调用它。 关于如何使当前对象位于可拖动对象下方,是否还有其他方法?

1 个答案:

答案 0 :(得分:1)

因此,问题是您的“可拖动对象”阻止了该对象其后的所有对象的光线投射,结果-您的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;
  }
}