c# - 如何在 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 函数并不总是在应该调用的时候调用,它只是在我用鼠标悬停在对象上时才会调用它。是否有其他方法可以让我将当前对象置于可拖动对象下方?
解决方案
因此,问题在于您的“可拖动”阻止了该对象后面任何对象的光线投射,因此 - 您的 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;
}
}
推荐阅读
- java - 如何消除以下警告?
- html - 具有向下三角形和统一背景图像的 Div
- html - 如何在 excel VBA 中将 ActiveWorkbook.Path 作为电子邮件中的链接发送?
- r - 具有多个点和 facet_wrap 的 geom_hline
- xquery - 如何使用 mem:node-replace 将内容提交到数据库中?
- java - 围绕调度模式的任何方式,无法控制引用的类
- python - 在一个数据框中合并多个 XLSX 工作表
- ios - movesense iOS 中的 Meas/ECG NOT_FOUND
- powershell - AD 用户导出/导入
- openscad - Openscad:从左括号中获取错误消息;为什么我不能重新分配数组变量?