如何将UI弹出面板与按钮的边缘对齐?



我在Unity中有一个"屏幕空间-相机"画布,里面有几个按钮。当我点击一个按钮时,它会在按钮的父按钮之外打开一个弹出窗口(UI面板(,我想将其与我按下的特定按钮对齐。我可以通过简单地将它的"rectTransform.position"与按钮的rectTransform.pposition匹配来将它定位在按钮上,但这只是将它放在按钮的中心。我希望它的边缘与按钮的边缘对齐。

我试图获得按钮的宽度和弹出窗口的宽度,然后将其移动宽度/2,但问题是,由于我使用的画布类型,这些值相差甚远(我认为这是问题(。我无法更改游戏的画布类型。我也尝试过使用Canvas.scaleFactor,但它似乎不起作用,或者我不知道如何使用它。

另一个大问题是按钮位于Canvas层次结构的深处,但弹出窗口是Canvas的直接子级。

以下是我迄今为止尝试的内容:

// Popup position & size
RectTransform popupPOS = popupCanvas.transform.GetComponent<RectTransform>(); 
float popupRealWidth = popupPOS.rect.width * mainCanvas.scaleFactor;
// Button position & size
RectTransform btnPOS = gameObject.GetComponent<RectTransform>();
float btnRealWidth = btnPOS.rect.width * mainCanvas.scaleFactor;
// Position popup to position of button
popupCanvas.gameObject.GetComponent<RectTransform>().position = new Vector3(btnPOS.position.x, btnPOS.position.y, btnPOS.position.z);
// Move Rect.x by "RealWidth"
popupPOS.localPosition = new Vector3(popupPOS.localPosition.x + popupRealWidth / 2, popupPOS.localPosition.y, popupPOS.localPosition.z);

我找到了一个解决方案。这是为了防止将来有人试图弄清楚这一点。

没有必要使用"scaleFactor"。我觉得我以前试过这个,但没用。也许是因为我没有遵守"PEMDAS"规则。。。叹气我的高中数学老师会摇头。

popupPos.localPosition = new Vector3(popupPos.localPosition.x + (popupPos.rect.width / 2) + (btnPos.rect.width / 2), popupPos.localPosition.y - (popupPos.rect.height / 2) + (btnPos.rect.height / 2), popupPos.localPosition.z);

这将弹出窗口(ui面板(与按钮的右上角对齐。

this.Parent = gameObject; //Or whatever your button is named
this.StartPosition = FormStartPosition.CenterParent;

我相信这就是你想要的。

最新更新