如何在Unity中将画布设置为特定的世界单位大小?

4
假设我有一个UI画布,它被设置为“世界空间”,并在世界中绝对定位在我的立方体上方。
我的立方体在运行时调整大小。
如果不缩放画布,如何设置画布的大小以匹配已知的立方体的世界单位宽度?
我知道你可以使用以下方式设置“画布单位”中的画布:
var rect = canvas.GetComponent<RectTransform>();
rect.sizeDelta = new Vector2(200, 200);

然而,200x200 是画布单位,而非世界单位;我的立方体宽度为 4 个单位;那么应该将 sizeDelta 设置为多少呢?

我猜这与 CanvasScale 组件有关,但我弄不明白;referenceUnitsPerPixel 是 100,作为比例因子是完全错误的,dynamicPixelsPerUnit 像是 1,这也是错误的。

2个回答

5
您只需要这样做:
  • Canvas组件的Render Mode属性设置为World(您已经完成了此步骤)
  • 删除CanvasScaler组件
  • 您的画布现在是一个3D对象:使用RectTransformWidthHeight属性来设置其大小。

请记住,您的Canvas将无法处理非常小的元素(默认的Image大小为100x100,这比您的Canvas要大得多)。

希望这可以帮助到您。


我并不真正理解为什么这个有效(或者更确切地说,Canvas Scaler 到底在做什么导致它在存在时无法工作),但是它完全有效,谢谢! - Doug
1
基本上,CanvasScaler 的作用是自动调整您的 UI 以适应多种屏幕尺寸/分辨率。 在您的情况下(大多数情况下 RenderMode 设置为 World),不需要进行缩放,因为您可以在世界单位中进行调整:例如,如果您希望 3D HUD 的宽度填满 4:3、16:9 或 21:9 屏幕,则可以进行缩放。 希望我表述清楚:否则,我将在我的回答中进一步解释 :) - Kardux

4
如果您想让UI元素在屏幕上显示的宽度实际上代表现实中的米数,您需要通过计算米数除以画布宽度来获得所需比例。例如,如果您要将UI元素设置为2米宽,而Canvas宽度为800,则应该使用 2 / 800 = 0.0025 来计算比例。然后,将Canvas上RectTransform的比例(Scale)属性设置为0.0025,确保其在X、Y和Z方向均等缩放。
参考文献:https://docs.unity3d.com/Manual/HOWTO-UIWorldSpace.html

1
你的回答是 ---> '然后你设置 Rect Transform 的 Scale 属性' ... 我的问题是 ---> '不缩放画布...' - Doug
我会保留它,因为这是Unity设置世界画布大小的首选方式。 - Anders
如果您想在此处留下答案,当然可以,但是用一个明确要求不在问题中使用的解决方案来回答问题,理应被投票降低评分。这不是最佳实践讨论网站;它是一个问答网站,您根本没有阅读问题。此外,请不要损坏问题。 - Doug
1
这是一个不好的问题,你应该告诉我们为什么不想按照Unity的方式进行缩放。否则你就是在与SDK作对。 - Anders
当画布的x/y比例不相等时,缩放画布会扭曲内容,这显然使其完全不适合动态调整大小。(我可以补充说,响应式调整大小是矩形变换具有锚点的原因;否则它只是一个固定偏移布局系统) - Doug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接