2

最近几天,我一直为 Unity 中的一个问题而头疼。

好的,我不会详细介绍我的游戏,但我已经做了一个超级简单的例子来代表我的问题。

我有这些组件的 2D 场景: 基本场景

当场景加载时,我点击这个脚本执行的按钮:

Vector3 pos = transform.position;
pos.x -= 10;
transform.position = pos;

我也试过这段代码:

transform.position = Camera.main.WorldToScreenPoint(new Vector3(0, 0, 0));

问题是,当我单击按钮时,对象的 x-pos 设置为 -1536,这与预期不同。图为点击按钮后的场景。注意 Rect Transform 值: 点击按钮后

所以我做了一点谷歌搜索,发现了 ScreenToWorldPoint、WorldToScreenPoint 等,但这些转换都没有解决我的问题。

我很确定我在这里遗漏了一些东西,它可能就在我面前,但我根本不知道是什么。

我希望有人能指出我正确的方向。

此致。

4

6 回答 6

2

问题是您使用transform.position的是rectTransform.anchoredPosition.

虽然 UI 元素确实仍然GameObjects并且确实Transform可以在脚本中访问普通组件,但您在编辑器中看到的RectTransform是构建在顶部的表示。这是 UI 元素的特殊检查器窗口,它使用锚定定位系统,因此您可以指定边缘如何与其父元素对齐。

当您设置GameObject'stransform.position时,您将提供以 3D 场景单位(默认为米)指定的世界空间位置。这不同于相对于画布或父 UI 元素的本地位置,以参考像素指定(参考像素大小由画布“参考分辨率”字段确定)。

您使用的一个潜在问题Camera.WorldToScreenPoint是该函数返回以像素为单位指定的位置。然而,如前所述,设置transform.position是在场景单位(即默认情况下为米)中指定的,而不是相对于父 UI 元素。但是,检查器知道它是一个 UI 元素,因此它不会向您显示该值,而是向您显示转换为 UI 本地坐标的世界位置。

换句话说,当您将位置设置为零时,您将获得在主摄像机视图中恰好位于场景零点上方的任何像素的索引,并将这些像素数转换为米,并将元素移动到那里。编辑器向您显示相对于对象的父 UI 元素的参考像素(不一定是屏幕像素,请检查您的画布设置)中的位置。要验证,请尝试稍微倾斜相机并注意显示的值会有所不同。

因此,您再次需要使用rectTransform.anchoredPosition,并且您还需要确保画布分辨率与您的屏幕分辨率相同(或进行数学计算以说明差异)。对象的锚定方式对于rectTransform值所指的内容也很重要。

于 2020-08-16T08:58:57.533 回答
1

尝试使用transform.localposition = new Vector3(0,0,0);您的按钮是多个游戏对象的孩子。您也可以尝试使用transform.TransformPoint,它应该只是将 localpos 转换为 worldpos。

于 2020-08-15T16:22:30.430 回答
1

问题是您的按钮位于另一个对象内。你想改变当地的立场。transform.localPosition -= new Vector3(10, 0, 0)

于 2020-08-15T16:38:46.790 回答
0

我有一个更好的主意。与其改变按钮的位置,为什么不改变按钮所代表的值呢?

移动按钮

请记住,按钮是游戏对象,每个游戏对象在其变换中都有一个位置向量。因此,如果您的按钮被命名为 ButtonA,那么在您的代码中您希望获得对它的引用。

 GameObject buttonA = GameObject.Find("ButtonA");

//或者您可以从检查器分配游戏对象

获得对按钮的引用后,您可以继续移动它。所以让我们假设我们想将 ButtonA 向左移动 10 个单位。

Vector3 pos = buttonA.transform.position;
 pos.X -= 10f;
 buttonA.transform.position = pos;
于 2020-08-14T09:07:06.143 回答
0

正如@Joseph 已经清楚解释的那样,您必须对您RectTransform的 UI 组件进行更改,而不是 change Transform

要实现您想要的,请这样做:

RectTransform rectTransform = this.GetComponent<RectTransform>();
Vector2 anchoredPos = rectTransform.anchoredPosition;
anchoredPos.x -= 10;
rectTransform.anchoredPosition = anchoredPos;

请记住,这10不是您的 3D 世界空间单位(如米或厘米)。

于 2020-08-17T08:54:38.603 回答
0

尝试这些事情,因为我不明白你想做什么

尝试使用 transform.deltaposition 转到画布,然后按屏幕大小进行缩放!您可以使用 transform.position = new Vector3(transform.position.x -10,transform.position.y, transform.positon.z)

如果这不起作用 transform.Translate(new Vector3(transform.deltaposition.x - 10,transform.deltaposition.y, transform.deltaposition.z);

于 2020-08-12T19:48:33.987 回答