草莓♭布丁

导航

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 2021-07-22 17:38  草莓♭布丁  阅读(865)  评论(0编辑  收藏  举报

Live2D