我目前正在尝试创建一个拖放系统,其中有一个可拖动的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函数并非总是在应有的时候被调用,它仅在我用鼠标悬停在对象上方时才调用它。 关于如何使当前对象位于可拖动对象下方,是否还有其他方法?
答案 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;
}
}