1. 使用EventSystem.RaycastAll方法判断鼠标是否在UI上
Unity提供了两种方法用于判断鼠标是否在UI上,第一种方法是使用EventSystem.RaycastAll方法。这个方法可以获取到鼠标点击时所在的所有UI元素,并返回一个RaycastResult类型的数组。
1.1 方法原型
public static RaycastResult[] RaycastAll(PointerEventData eventData)
1.2 方法参数
PointerEventData:指针事件数据,用于传递当前鼠标事件的相关信息。
1.3 示例代码
using UnityEngine;
using UnityEngine.EventSystems;
public class MouseUIJudgement : MonoBehaviour
{
private EventSystem eventSystem;
private void Awake()
{
eventSystem = FindObjectOfType();
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
PointerEventData eventData = new PointerEventData(eventSystem);
eventData.position = Input.mousePosition;
RaycastResult[] results = new RaycastResult[10];
eventSystem.RaycastAll(eventData, results);
if (results.Length > 0)
{
// 鼠标在UI上
// TODO: 执行相应的逻辑
}
else
{
// 鼠标不在UI上
// TODO: 执行相应的逻辑
}
}
}
}
在示例代码中,我们监听鼠标左键点击事件(GetMouseButtonDown(0))并创建一个PointerEventData对象,将鼠标的当前位置赋值给eventData.position。然后我们创建一个长度为10的RaycastResult数组用于存储射线检测的结果(你也可以根据实际情况调整数组长度)。
接下来调用eventSystem的RaycastAll方法,传入eventData和results数组作为参数。方法执行后,如果results数组的长度大于0,说明鼠标点击在UI上,否则说明鼠标点击不在UI上。
2. 使用RectTransformUtility.ScreenPointToLocalPointInRectangle方法判断鼠标是否在UI上
第二种方法是使用RectTransformUtility.ScreenPointToLocalPointInRectangle方法。这个方法可以将屏幕上的点的位置转换为相对于指定RectTransform组件的本地坐标。
2.1 方法原型
public static bool ScreenPointToLocalPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam, out Vector2 localPoint)
2.2 方法参数
rect:指定的RectTransform组件。
screenPoint:屏幕上的点的位置。
cam:指定的摄像机,默认为null。
localPoint:转换后的点的位置。
2.3 示例代码
using UnityEngine;
using UnityEngine.UI;
public class MouseUIJudgement : MonoBehaviour
{
public RectTransform rectTransform;
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
Vector2 screenPoint = Input.mousePosition;
Vector2 localPoint;
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, screenPoint, null, out localPoint))
{
// 鼠标在UI上
// TODO: 执行相应的逻辑
}
else
{
// 鼠标不在UI上
// TODO: 执行相应的逻辑
}
}
}
}
在示例代码中,我们监听鼠标左键点击事件并获取鼠标当前的屏幕上的点的位置。然后我们声明一个Vector2类型的变量localPoint用于存储转换后的点的位置。
接下来调用RectTransformUtility的ScreenPointToLocalPointInRectangle方法,传入rectTransform、screenPoint和null作为参数,localPoint作为out参数。方法执行后,如果返回值为true,说明鼠标点击在UI上,否则说明鼠标点击不在UI上。
总结
通过使用EventSystem.RaycastAll方法和RectTransformUtility.ScreenPointToLocalPointInRectangle方法,我们可以判断鼠标是否在UI上。两种方法各有优劣,具体选择哪种方法取决于实际需求和个人偏好。使用EventSystem.RaycastAll方法可以获取到所有与鼠标点击位置相交的UI元素,适用于需要对鼠标点击区域进行更精确的判断的情况。而使用RectTransformUtility.ScreenPointToLocalPointInRectangle方法只能判断指定RectTransform组件内的鼠标点击位置,适用于需要对特定UI元素进行判断的情况。