unity3d - (Unity + 2D) 更改 UI 按钮位置问题

标签 unity3d unity-ui

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

好吧,我不会详细介绍我的游戏,但我做了一个非常简单的例子来说明我的问题。

我有一个 2D 场景这些组件: Basic scene

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

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 值: After button click

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

我很确定我在这里遗漏了一些东西,这可能就在我面前,但我就是想不通是什么。

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

最好的问候。

最佳答案

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

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

当您设置 GameObjecttransform.position 时,您提供了一个以 3D 场景单位(默认为米)指定的世界空间位置。这不同于相对于 Canvas 或父 UI 元素的本地位置,在引用像素中指定(引用像素大小由 Canvas 的“引用分辨率”字段确定)。

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

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

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

关于unity3d - (Unity + 2D) 更改 UI 按钮位置问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63383530/

相关文章:

c# - 相对于它始终面对的点移动对象会导致螺旋轨道

audio - Pre Spatializer 效果 - Unity 和 Google VR 音频

c# - Unity定位与Update在功能上的不同

unity3d - 启动时 Unity 中的错误问题

c# - Raycast 如何与 Unity 的 Canvas UI 元素交互?

c# - 将类的所有字段设置为默认值的最有效方法

unity3d - 在手机浏览器上玩Unity webGl游戏时如何保存游戏数据?

unity3d - Unity 如何在图像周围流动 TextMesh Pro 文本?

c# - 使用渲染器(世界空间)(Unity)在游戏对象周围绘制边界矩形(屏幕空间)

unity-game-engine - 如何在 UI 中设置相机 View 特定区域