wake-up-neo.net

Holen Sie sich eine UnityEngine.UI.Images-Position in screenSpace und berechnen Sie einen normalisierten Versatz (innerhalb einer Überlagerungsfläche)

Das anstehende Problem:

Vereinfacht

Gegeben eine UnityEngine.Ui.Image Wie findet man die X-, Y-Position eines normalisierten Offsets (wie 0.4, 0.3 von oben links) in diesem Bild in ScreenSpace-Einheiten wie 400.300

Ich denke, ich muss den oberen linken ScreenSpace-Wert finden und dann die gerenderte Gesamtgröße der Skalierung der normalisierten Offsets anhand des tatsächlichen Größenverhältnisses in Pixeln kennen.

Abbildung 1:  Figure 1:

Abbildung 2 zeigt die zu verwendenden normalisiertenOffsets

Figur 2:  An example stored Rect "offset"

Genau gesagt, muss ich den Offset in ScreenSpace-Pixeln des topLeft des Rect ermitteln, den ich gegen das Bild gespeichert habe.

Ich weiß, dass es sich wahrscheinlich um eine Kombination aus Camera.main.ViewportToWorldPoint () und einigen Verweisen auf die Grenzen handelt. Möglicherweise skaliert das durch backgroundImage.Sprite.pixelsPerUnit?

Mühe zu visualisieren, wie man das genau hinbekommt.

vielen Dank

16
twobob

Ich vermute, Sie haben keine Skalierung oder Drehung in den Bildeltern und die Position Y ist 0.

Zuerst können Sie mit rectTransform.GetWorldCorners() die Position der oberen linken Ecke Ihres Bildes ermitteln:

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

Dann müssen Sie Ihren normalisierten Versatz in einen Weltraum um ein Verhältnis zwischen Ihrer Bildgröße und Ihrer Rektgröße umwandeln und die Position der oberen linken Ecke hinzufügen:

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

(Es ist dieselbe Formel für die Y-Koordinate, aber Sie müssen von Ihrem Verhältnis realOffsetY subtrahieren, da der Versatz von der oberen linken Ecke berechnet wird.)

Hier ist die vollständige Methode:

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);
}

Wenn Sie möchten, dass dieser Weltraum Speicherplatz anzeigt, verwenden Sie die Kameramethode:

camera.WorldToScreenPoint(positionOffset);
1
Ludovic Feltz