如何将鼠标位置重新映射到潜在的移动UI元素?



我正在制作一款带有大量UI的RTS游戏,所以我将主摄像机的输出移至仅占屏幕一半的四轴屏幕上,并将一些UI效果分散到其余部分。我目前与游戏互动的方式是使用unity的Input.mousePosition。当我将相机的馈送移动到四边形时,显然这些像素坐标是扭曲的,所以我像这样固定它们:

mapMousePos = (Input.mousePosition * mscaleCorr - mapCorrection * mscaleCorr);

mapCorrection是较小feed的像素偏移量,而mscaleCorr是一个经过反复试验的神奇数字-一个临时修复。

关键是,现在我意识到,在不同的分辨率下运行这款游戏几乎肯定会打破这些神奇的数字。

我想让mapMousePos是Input。鼠标位置是在我将游戏玩法移到小四边形之前——从四边形左下方的(0,0)移动到四边形右上角的屏幕(宽度,高度)。这是为了在我的游戏摄像机上很好地与screenToWorld点一起工作。

我有相机馈电四边形父级到一个全屏四边形,并尝试使用它们的相对位置来应用必要的转换,但它没有工作,我猜是因为它是一个像素问题。

我在文档中挖掘了一个使用Camera内置的worldToScreenPoint函数的解决方案,没有任何运气。我相信我最终会遇到一个解决方案,但我会非常感谢任何提示。

我是这么想的;这是愚蠢的,但它有效。

我将对象放置在四边形的左下方和右上方,以代码形式存储为bL和tR。

然后我使用ScreenToWorldPoint()将mousePosition转换为worldPosition,通过减去左下角的位置来重新映射它,并通过将其除以右上角的增量来获得它在屏幕上的百分比。将这个百分比乘以游戏摄像头的像素尺寸,瞧!

在代码中:

Vector3 wPos = finalcam.ScreenToWorldPoint(Input.mousePosition);
wPos -= bL.transform.position;
mapMousePos = new Vector2(Mathf.Abs(wPos.x), Mathf.Abs(wPos.y));
mapMousePos = new Vector2(
mapMousePos.x / (tR.transform.position.x -bL.transform.position.x),
mapMousePos.y / (tR.transform.position.y - bL.transform.position.y));
mapMousePos = new Vector2(mapMousePos.x * Camera.main.pixelWidth, mapMousePos.y * Camera.main.pixelHeight);

再一次,这是愚蠢的,但它似乎有效。如果有人知道一个更简洁的方法,我就把这个留着。

最新更新