获取屏幕空间中的 UnityEngine.UI.Images 位置并计算标准化偏移(在覆盖画布内)

问题描述 投票:0回答:1

手头的问题:

简化

给定一个 UnityEngine.Ui.Image 如何找到 X,Y 位置 其中的标准化偏移量(例如从左上角开始的 0.4、0.3) ScreenSpace 单位中的图像,例如 400,300

我想我需要找到左上角的 ScreenSpace 值 然后知道图像的渲染总大小,通过以像素表示的实际大小比率来缩放归一化偏移。

图1: Figure 1:

图 2 显示了要使用的标准化偏移量

图2: An example stored Rect

所以,简而言之,我需要找到屏幕空间像素中的偏移量 我针对图像存储的矩形的左上角。

我认识到它可能是 Camera.main.ViewportToWorldPoint() 和一些对边界的引用的组合, 可能通过 backgroundImage.sprite.pixelsPerUnit 进行缩放?

努力想像如何准确地完成这件事。

谢谢

c# unity-game-engine projection unity-ui
1个回答
0
投票

我猜你的图像父级中没有任何缩放或旋转,并且位置 Y 为 0。

首先你可以通过

rectTransform.GetWorldCorners()
获取图像左上角的位置:

    //Upper left corner
    Vector3[] v = new Vector3[4];
    image.rectTransform.GetWorldCorners(v);
    var recPos = v[1];

然后,您必须将标准化偏移量转换为世界空间偏移量(按图像大小与矩形大小之间的比率),并添加左上角的位置:

    var recWidth = image.rectTransform.sizeDelta.x;
    var imgWidth = image.sprite.texture.width;
    var realOffsetX = offsetX * (recWidth / imgWidth);
    var realPosX = recPos.x + realOffsetX;

(Y 坐标的公式相同,但您必须减去您的比率

realOffsetY
,因为偏移量是从左上角计算的)

完整方法如下:

private Vector3 GetPositionOffset(Image image, float offsetX, float offsetY)
{
    //Upper left corner
    Vector3[] v = new Vector3[4];
    image.rectTransform.GetWorldCorners(v);
    var recPos = v[1];

    //X coordinate
    var recWidth = image.rectTransform.sizeDelta.x;
    var imgWidth = image.sprite.texture.width;
    var realOffsetX = offsetX * (recWidth / imgWidth);
    var realPosX = recPos.x + realOffsetX;

    //Y coordinate
    var recHeight = image.rectTransform.sizeDelta.y;
    var imgHeight = image.sprite.texture.height;
    var realOffsetY = offsetY * (recWidth / imgWidth);
    var realPosY = recPos.y - realOffsetY;

    //Position
    return new Vector3(realPosX, realPosY, image.transform.position.z);
}

然后如果你想要这个世界空间到屏幕空间只需使用相机方法:

camera.WorldToScreenPoint(positionOffset);
© www.soinside.com 2019 - 2024. All rights reserved.