作者:临冬将至 | 来源:互联网 | 2023-08-24 18:44
因为在脚本中直接改pivot会导致UI移位,就自己写了个方法,思路也很简单粗暴,就是计算距离然后把它拽回去,本以为不会出bug的而坑就是Unity会自作聪明地对于一些特殊的布
因为在脚本中直接改pivot会导致UI移位,就自己写了个方法,思路也很简单粗暴,就是计算距离然后把它拽回去,本以为不会出bug的...
而坑就是Unity会自作聪明地对于一些特殊的布局(比如拉伸至全屏状态时)进行自动修正,但一般的UI布局它又不修正...
观察后能看出Unity是只改了LocalPosition,最后修改代码如下:
// 改变一个RectTransform组件的pivot值,但是保持其实际位置不变
public static void ChangePivot(RectTransform rectTransform, float newPivotX, float newPivotY)
{
float originalPivotX = rectTransform.pivot.x;
float originalPivotY = rectTransform.pivot.y;
// 在某些特定布局下,Unity会在设置Pivot时自动调整LocalPosition以试图保持UI元件不动,但这个“贴心”设定充满意外惊喜需要排除
Vector3 originalLocalPosition = rectTransform.localPosition;
rectTransform.pivot = new Vector2(newPivotX, newPivotY);
rectTransform.localPosition = originalLocalPosition;
rectTransform.transform.position += new Vector3((newPivotX - originalPivotX) * rectTransform.rect.width, (newPivotY - originalPivotY) * rectTransform.rect.height, 0);
}