unity 如何判断鼠标是否在哪个UI上(两种方法)

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元素进行判断的情况。

后端开发标签