Как я могу получить объект пользовательского интерфейса под мышью в Unity? - PullRequest
0 голосов
/ 08 сентября 2018

В настоящее время я пытаюсь создать систему перетаскивания, в которой у меня есть перетаскиваемый объект пользовательского интерфейса, который я могу разместить на другом объекте. Но я не знаю, как я могу получить объект пользовательского интерфейса под мышью и перетаскиваемый объект пользовательского интерфейса.

Это код моего 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 голосов
/ 09 сентября 2018

Итак, проблема в том, что ваш «перетаскиваемый» блокирует лучевую трансляцию для любых объектов позади этого объекта, и в результате ваш 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;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...