You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中如何获取UI GameObject(UI Image)上的鼠标相对坐标

解决方案

实现思路

  • 将屏幕空间的鼠标坐标转换为目标UI Image对应矩形的局部坐标
  • 把局部坐标的原点从RectTransform默认轴心点映射到左下角
  • 按32×32的纹理尺寸做比例缩放,得到符合需求的坐标值

完整修改代码

using UnityEngine;
using UnityEngine.UI;

public class UIImagePixelCoordGetter : MonoBehaviour
{
    [SerializeField] private Text coordinatesText;
    // Inspector面板中拖入你要检测的目标UI Image的RectTransform组件
    [SerializeField] private RectTransform targetImageRect;
    // 纹理固定尺寸,可按需调整
    private const int TexturePixelSize = 32;

    void Update()
    {
        // 转换屏幕鼠标坐标到UI矩形的局部坐标
        if (RectTransformUtility.ScreenPointToLocalPointInRectangle(
            targetImageRect, 
            Input.mousePosition, 
            // Canvas为ScreenSpace-Overlay模式时此处传null,其他模式传渲染该Canvas的Camera
            null, 
            out Vector2 localPoint))
        {
            Rect rect = targetImageRect.rect;
            
            // 归一化坐标后映射到32×32的纹理尺寸范围
            float x = Mathf.InverseLerp(rect.xMin, rect.xMax, localPoint.x) * TexturePixelSize;
            float y = Mathf.InverseLerp(rect.yMin, rect.yMax, localPoint.y) * TexturePixelSize;
            
            // 可选:限制坐标范围在0~32,避免鼠标移出UI时出现异常值
            x = Mathf.Clamp(x, 0, TexturePixelSize);
            y = Mathf.Clamp(y, 0, TexturePixelSize);

            // 需要整像素坐标的话直接做取整处理即可
            coordinatesText.text = $"{Mathf.RoundToInt(x)}, {Mathf.RoundToInt(y)}";
        }
    }
}

注意事项

  • 运行前请先把目标UI Image的RectTransform组件拖入脚本对应的targetImageRect字段
  • 若你的Canvas是Screen Space - Camera或World Space模式,请把渲染该Canvas的Camera传入ScreenPointToLocalPointInRectangle的第三个参数,不要传null
  • 该方法适配UI的任意缩放尺寸,不管你把UI拉多大显示,都会严格按比例映射到32×32的坐标范围

内容的提问来源于stack exchange,提问作者Swagrim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:24:05