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