Unity 4.6:在运行时添加的按钮实例不会被参考分辨率调整?

时间:2014-10-03 22:49:00

标签: unity3d

(使用Unity 4.6.0b20)

我遇到了一个问题,即预编辑按钮大小在编辑器中添加时可以正常工作,但在脚本添加时似乎忽略了参考分辨率。

这使用具有参考分辨率1280x720和MatchWidthOrHeight的Canvas。 Canvas具有按钮的面板垂直布局组。 Button具有首选宽度/高度,并保存为预制件,因此可以在运行时从资产创建新实例。

enter image description here

在编辑器中,我可以将预制件拖到场景中,将实例添加到面板中,该面板也具有宽度102,并且它们可以很好地堆叠和缩放:

enter image description here

但是当我通过脚本向面板添加预制件的新实例时,它们显示的尺寸错误。看看尺寸我的猜测是102像素尺寸没有被参考分辨率缩放:

enter image description here

脚本代码通过GameObject.Instantiate()创建实例,并通过设置transform.parent添加到Panel:

GameObject uiInstance = (GameObject)GameObject.Instantiate(Resources.Load<GameObject>(assetPath));
uiInstance.transform.parent = unitButtonsPanel.transform;

我认为将Button添加到面板时需要做的更多,而不仅仅是设置Parent,或者这是测试版的错误......

建议?

3 个答案:

答案 0 :(得分:27)

使用transform.SetParent方法在第二个参数中传递false:

transform.SetParent(transform, false);

这样可以防止世界定位和缩放。 您可以在统一手册中找到更多信息,搜索“UICreateFromScripting”。

答案 1 :(得分:3)

我找到了原因 - 当脚本添加预制件时,Scale值设置不正确;在此测试中,Scale被设置为1.186284。

但是如果脚本在添加按钮后立即将scale设置为1.0:

GameObject uiInstance = (GameObject)GameObject.Instantiate(Resources.Load<GameObject>(assetPath));
uiInstance.transform.parent = unitButtonsPanel.transform;
// HACK force scale to 1.0
uiInstance.transform.localScale = Vector3.one;

新按钮实例的大小正确。

imho这是一个Unity错误,因为在编辑器中添加预制实例设置了规模1.0,预制本身的规模为1.0,所以我看不出为什么从脚本添加它应该采取不同的行为。但我有点猜测,因为新用户界面还没有太多文档:)

答案 2 :(得分:3)

这不是一个错误,它是执行问题的顺序。使用Unity的新布局组件时,值由布局组件驱动,布局组件在进行布局重建调用的帧结束时计算一次。如果您在脚本中基于布局元素驱动的新rectTransform.rect计算中的任何内容,您需要等到执行此计算或使用

LayoutRebuilder.MarkLayoutForRebuild(转换为RectTransform);

在使用rectTransform中的任何内容(如scale,pos等)之前,你仍然需要等到帧结束才能进行这些计算。当我第一次开始动态创建时,这让我感到困惑了一段时间UI元素和比例为零取决于我何时实例化它们。

您可以在此处阅读有关重建调用以及布局计算内容的执行顺序: http://docs.unity3d.com/Manual/UIAutoLayout.html