Skip to content

Instantly share code, notes, and snippets.

@pppoe252110
Created July 31, 2024 12:27
Show Gist options
  • Save pppoe252110/6dbc2c031a58db016210fed2052f7cb6 to your computer and use it in GitHub Desktop.
Save pppoe252110/6dbc2c031a58db016210fed2052f7cb6 to your computer and use it in GitHub Desktop.
Zoom and Move UI Panel Relative to Mouse
using UnityEngine;
public class UIZoomMove : MonoBehaviour
{
[Header("Zoom")]
[SerializeField] private float _zoomSpeed = 0.1f;
[SerializeField] private float _minZoom = 0.1f;
[SerializeField] private float _maxZoom = 5f;
[Header("Properties")]
[SerializeField] private Canvas _parentCanvas;
private RectTransform _rectTransform;
private Vector2 _lastMousePos;
void Start()
{
_rectTransform = transform as RectTransform;
}
void Update()
{
float scrollDelta = Input.mouseScrollDelta.y;
Vector2 mousePos = Input.mousePosition / _parentCanvas.scaleFactor;
if (scrollDelta != 0.0f)
{
Vector2 mouseDir = mousePos - new Vector2(_parentCanvas.renderingDisplaySize.x / 2f, _parentCanvas.renderingDisplaySize.y / 2f) / _parentCanvas.scaleFactor;
var targetScale = _rectTransform.localScale.x * (1f + scrollDelta * _zoomSpeed);
var targetScaleClamped = Mathf.Clamp(targetScale, _minZoom, _maxZoom);
var scaleDelta = (targetScaleClamped - targetScale) / _rectTransform.localScale.x;
var clamp = Mathf.Abs(scaleDelta) / (scrollDelta * _zoomSpeed);
_rectTransform.localScale = targetScaleClamped * Vector3.one;
_rectTransform.anchoredPosition -= (mouseDir - _rectTransform.anchoredPosition) * (1f - (1f + scrollDelta * -_zoomSpeed)) * (1f - Mathf.Abs(clamp));
}
if (Input.GetMouseButtonDown(2))
{
_lastMousePos = mousePos;
}
if (Input.GetMouseButton(2))
{
Vector2 mouseMoveDir = mousePos - _lastMousePos;
_rectTransform.anchoredPosition += mouseMoveDir;
_lastMousePos = mousePos;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment