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 2 zeigt die zu verwendenden normalisiertenOffsets
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
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);