修改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 @   xhbnfcl  阅读(636)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示