修改RectTransform.pivot时UI位置会移动的问题(有小坑)

因为在脚本中直接改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);
        }

 

posted @ 2022-08-12 12:05  xhbnfcl  阅读(855)  评论(0)    收藏  举报