unity里鼠标位置是否在物体上。

发布于:2024-07-04 ⋅ 阅读:(18) ⋅ 点赞:(0)

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对象,推荐使用第三种方法。