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
相关产品推荐
相关产品推荐

