在screenSpace中获取UnityEngine.UI.Images位置并计算标准化偏移量(在叠加画布内)

two*_*bob 15 c# unity-game-engine unity-ui

手头的问题:

鉴于UnityEngine.Ui.Image如何在ScreenSpace单位(如400,300)中找到该图像内的标准化偏移(如左上角0.4,0.3)的X,Y位置

我想我需要找到左上方的ScreenSpace值,然后知道图像的渲染总大小按照像素表示的实际大小比例缩放归一化偏移量.

图1: 图1:

图2显示了要使用的normalisedOffsets

图2: 存储Rect

所以,在精确的情况下,我需要找到我在图像上存储的Rect的topLeft的ScreenSpace像素中的偏移量.

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

努力想象如何完成这项工作.

谢谢

Lud*_*ltz 0

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

首先,您可以使用以下命令获取图像左上角的位置rectTransform.GetWorldCorners()

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

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

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

(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);
}
Run Code Online (Sandbox Code Playgroud)

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

camera.WorldToScreenPoint(positionOffset);
Run Code Online (Sandbox Code Playgroud)