Ответ 1
Я думаю, у вас нет никакого масштаба или поворота в родителях изображения, а позиция 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);