/// <summary>
/// 获取屏幕点击贴图像素位置
/// 点击屏幕 点击到图片,计算图片的像素坐标(图片的屏幕像素范围(宽高),屏幕坐标到图片像素坐标的转换) 获取颜色
/// </summary>
/// <param name="screenPosition">屏幕坐标</param>
/// <param name="rectT">图片位置</param>
/// <param name="texture">Image 中的贴图</param>
/// <returns>贴图像素 uv 值</returns>
private Vector2 ReadScreenPositionTextureColor(Vector2 screenPosition, RectTransform rectT, Texture2D texture)
{
float width = rectT.rect.width * rectT.localScale.x;
float heigth = rectT.rect.height * rectT.localScale.y;
//UI空间坐标到屏幕坐标的转换
//图片范围
Vector2 v0 = new Vector2(rectT.localPosition.x + (Screen.width - width) / 2
, rectT.localPosition.y + (Screen.height - heigth) / 2);
Vector2 v1 = new Vector2(rectT.localPosition.x + (Screen.width + width) / 2
, rectT.localPosition.y + (Screen.height + heigth) / 2);
if (screenPosition.x < v1.x && screenPosition.x > v0.x && screenPosition.y < v1.y && screenPosition.y > v0.y)
{
//点击到图片区域
float x = (screenPosition.x - v0.x) / width * texture.width;
float y = (screenPosition.y - v0.y) / heigth * texture.height;
return new Vector2(x, y);
}
else
{
Debug.Log("点击到图片之外");
return new Vector2(0, 0);
}
}
使用:
public Texture2D main_tex;
public RawImage image;
void Start()
{
image.texture = main_tex;
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
Vector2 vOut = ReadScreenPositionTextureColor(Input.mousePosition, image.GetComponent<RectTransform>(), main_tex);
Color colorOut = rgb_tex.GetPixel((int)vOut.x, (int)vOut.y);
Debug.Log(colorOut);
}
}
更新: pc端全屏时发现,鼠标点击的坐标错误,导致计算的贴图uv值错误。 原因: Canvas 分辨率与电脑分辨率不一致。
所以,动态修改Canvas设置为屏幕分辨率:
更新: 自动转换屏幕分辨率 相对于 CanvasScaler 分辨率的新坐标,如果屏幕分辨率与CanvasScaler 设置值不一致,使用这个。
public CanvasScaler scaler;
private Vector2 ReadScreenPositionTextureColor(Vector2 InputPosition, RectTransform rectT, Texture2D texture)
{
float width = rectT.rect.width * rectT.localScale.x;
float heigth = rectT.rect.height * rectT.localScale.y;
//屏幕分辨率到自定义的 CanvasScaler 分辨率的坐标转换
Vector2 screenPosition = new Vector2(InputPosition.x / Screen.width * scaler.referenceResolution.x,
InputPosition.y / Screen.height * scaler.referenceResolution.y);
//UI空间坐标到屏幕坐标的转换
//图片范围(四个角坐标)
Vector2 v0 = new Vector2(rectT.localPosition.x + (scaler.referenceResolution.x - width) / 2
, rectT.localPosition.y + (scaler.referenceResolution.y - heigth) / 2);
Vector2 v1 = new Vector2(rectT.localPosition.x + (scaler.referenceResolution.x + width) / 2
, rectT.localPosition.y + (scaler.referenceResolution.y + heigth) / 2);
Debug.Log($"v0:{v0} v1:{v1} screenPosition:{screenPosition}");
if (screenPosition.x < v1.x && screenPosition.x > v0.x && screenPosition.y < v1.y && screenPosition.y > v0.y)
{
//点击到图片区域
float x = (screenPosition.x - v0.x) / width * texture.width;
float y = (screenPosition.y - v0.y) / heigth * texture.height;
return new Vector2(x, y);
}
else
{
Debug.Log("点击到图片之外");
return new Vector2(0, 0);
}
}