有一个代码通过鼠标在单元格上拖动 UI 对象,每个单元格是 25 单位米。
int i = (int)Math.Round(Input.mousePosition.x / 25) * 25;
discreteX = i;
int j = (int)Math.Round(Input.mousePosition.y / 25) * 25;
discreteY = j;
g.transform.GetComponent<RectTransform>().anchoredPosition =
new Vector3(discreteX, discreteY);
它运行良好,anchoredPosition.x总是经过 0,然后变为 +25、+50、+75 等等。
问题是鼠标的坐标与对象的坐标不匹配g,例如,当鼠标悬停在零时 - 即 在左下角,该对象g位于屏幕的中心,其位置为零anchorPosition
在这种情况下,如果anchoredPositon我们改为使用通常的坐标分配
g.transform.position = new Vector3(discreteX, discreteY);
那么鼠标光标和对象的位置g重合,但它的anchoredPosition 永远不会通过0 - 我总是x看到坐标为-35、-10、15、40 等形式的图片。那些。步长仍然是 25,但不是 25 的倍数!
如何解决这个问题呢?将鼠标与坐标对齐anchoredPosition,或保持正常鼠标位置以 25 为单位增量为 25 的倍数。我该怎么做?
Input.mousePosition将其位置存储在屏幕坐标中,其中左下角(0,0)是屏幕分辨率的(宽度,高度)。(0,0) y
anchorPosition取决于您在哪里设置对象的锚点。它们是从父级考虑的。选择一个对象,RectTransform您将几乎立即在组件名称下方看到一个带有锚符号的正方形 - 您将middle - middle沿边缘书写它,并在中心有一个带点的红十字。该点是父坐标中的一个符号 (0,0)。单击此字段,您将看到可能的预配置绑定选项。如果您选择
bottom - left- 那么您的对象的 (0,0) 将成为父对象的左下角。如果同时你的父对象的大小对应于屏幕分辨率,那么对象和屏幕的坐标平面将重合。结果Input.mousePosition,anchorPosition可以安全地直接替换。在父级大小与屏幕不匹配的情况下,您可以使用一个变态
RectTransformUtility的,可以将屏幕坐标转换为特定 RectTransform 的本地坐标。以防万一,这是另一篇关于使用 RectTransform 的基础知识的文章。