草莓♭布丁

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

Unity以任意点为中心放大UGUI

在缩放地图等物体时,缩放中心往往是鼠标中心。

方案1,修改轴心

当然,更改轴心是一种思路,不过在Unity编辑器中修改轴心时,位置会一起移动。

而在代码中修改轴心时,位置不会跟着动,整个界面会歪掉,需要再次计算位置,不太方便。

方案2,先缩放,再计算位置

轴心其实就是物体的坐标原点,我们想让一个点为缩放中心,实际上就是要保证缩放前后位置不变。

例如(100,100),放大1.2倍到了(120,120),我们还想让这个点显示在(100,100)的位置上,就需要把整体位置移动(-20,-20)。

具体代码如下(rect就是要缩放的rectTransform):

public void Scale(float cur_Scare,Vector2 center_ScreenPos)
{
  //缩放中心屏幕坐标转RectTransform下坐标
  Vector2 center_Local;
  RectTransformUtility.ScreenPointToLocalPointInRectangle(rect, center_ScreenPos, Camera.main, out center_Local);
  //计算中心坐标的当前位置
  float old_Scare = rect.localScale.x; //原缩放比例
  float old_px = center_Local.x / old_Scare;
  float old_py = center_Local.y / old_Scare;
  float cur_pxPos = old_px * cur_Scare;
  float cur_pyPos = old_py * cur_Scare;
  //计算偏移量
  float deltaX = center_Local.x - cur_pxPos;
  float deltaY = center_Local.y - cur_pyPos;
  rect.localScale = new Vector3(cur_Scare, cur_Scare, 1);
  rect.localPosition += new Vector3(deltaX, deltaY, 0);
}

注意,这是锚点全在(0.5,0.5)的情况,有锚点固定的请自行设置offsetMin和offsetMax

posted on   草莓♭布丁  阅读(1033)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
Live2D
欢迎阅读『Unity以任意点为中心放大UGUI』
点击右上角即可分享
微信分享提示