手头的问题:
简化
Given an UnityEngine.Ui.Image How does one find the X,Y position of a normalised offset (like 0.4, 0.3 from the top left) inside that image in ScreenSpace units like 400,300
我想我需要找到左上角的 ScreenSpace 值 然后通过以像素表示的实际大小比率来了解图像的渲染总大小缩放归一化偏移量。
图 2 显示了要使用的 normalisedOffsets
So, in precis, I need to find the offset in ScreenSpace pixels of the topLeft of the Rect I have stored against the image.
我认识到它可能是 Camera.main.ViewportToWorldPoint() 和一些对边界的引用的组合, 可能通过 backgroundImage.sprite.pixelsPerUnit 缩放它?
努力想象如何准确地完成这项工作。
谢谢
最佳答案
我猜你在图像父级中没有任何缩放或旋转并且位置 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);
关于c# - 获取屏幕空间中的 UnityEngine.UI.Images 位置并计算归一化偏移量(在覆盖 Canvas 内),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51294475/