1. 使用Raycast
如果你的图片是在UI Canvas上,可以使用Raycast来检测鼠标点击是否在图片上。
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class ImageClickChecker : MonoBehaviour
{
public Image targetImage;
void Update()
{
if (Input.GetMouseButtonDown(0))
{
if (IsPointerOverUIObject(targetImage.gameObject))
{
Debug.Log("Mouse is over the image!");
}
else
{
Debug.Log("Mouse is not over the image.");
}
}
}
private bool IsPointerOverUIObject(GameObject target)
{
PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
pointerEventData.position = Input.mousePosition;
List<RaycastResult> results = new List<RaycastResult>();
EventSystem.current.RaycastAll(pointerEventData, results);
foreach (RaycastResult result in results)
{
if (result.gameObject == target)
{
return true;
}
}
return false;
}
}
2. 使用RectTransform Utility
另外一种方法是直接使用RectTransformUtility
来进行坐标转换和检测。
using UnityEngine;
using UnityEngine.UI;
public class ImageClickChecker : MonoBehaviour
{
public Image targetImage;
void Update()
{
if (Input.GetMouseButtonDown(0))
{
if (IsMouseOverImage(targetImage))
{
Debug.Log("Mouse is over the image!");
}
else
{
Debug.Log("Mouse is not over the image.");
}
}
}
private bool IsMouseOverImage(Image image)
{
RectTransform rectTransform = image.GetComponent<RectTransform>();
Vector2 localMousePosition = RectTransformUtility.ScreenPointToLocalPointInRectangle(
rectTransform, Input.mousePosition, null, out Vector2 localPoint);
return rectTransform.rect.Contains(localPoint);
}
}
3. 使用Collider和Physics Raycast
如果你的图片是3D对象,使用Collider和Physics Raycast可以更容易实现。
using UnityEngine;
public class ImageClickChecker : MonoBehaviour
{
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
if (hit.collider != null && hit.collider.gameObject == this.gameObject)
{
Debug.Log("Mouse is over the image!");
}
else
{
Debug.Log("Mouse is not over the image.");
}
}
}
}
}
根据你的具体需求,选择适合的检测方法。如果你的图片在Canvas上,推荐使用第一种或第二种方法;如果你的图片是3D对象,推荐使用第三种方法。