using UnityEngine; public class Draw2DNavigation : MonoBehaviour { [Header("Cible à zoomer / déplacer (UI root)")] public Transform Draw2D; [Header("Limites de zoom")] public float minScale = 0.3f; public float maxScale = 8f; [Header("Vitesses de zoom")] public float mouseZoomSpeed = 1.0f; // zoom molette public float pinchZoomSpeed = 0.005f; // zoom pinch 2 doigts [Header("Vitesses de pan (déplacement)")] public float mousePanSpeed = 1.0f; // pan souris public float touchPanSpeed = 1.0f; // pan touch private bool isPanningMouse = false; private Vector3 lastMousePanPosition; void Update() { if (WallPoint.AnyPointDragging) return; HandleMouseZoom(); HandleMousePan(); HandleTouchZoomAndPan(); } // ---------- ZOOM SOURIS (PC / Laptop) ---------- void HandleMouseZoom() { float scroll = Input.GetAxis("Mouse ScrollWheel"); if (Mathf.Abs(scroll) > 0.0001f && MouseCheck.InOut()) { float factor = 1f + scroll * mouseZoomSpeed; ApplyZoomFactor(factor); } } // ---------- PAN SOURIS (drag bouton gauche) ---------- void HandleMousePan() { // on bloque le pan souris si on est sur mobile (optionnel mais propre) #if UNITY_EDITOR || UNITY_STANDALONE || UNITY_WEBGL if (Input.touchCount > 0) return; // si touch actif, on évite conflit #endif // début du drag if (Input.GetMouseButtonDown(1) && MouseCheck.InOut()) { isPanningMouse = true; lastMousePanPosition = Input.mousePosition; } // drag en cours if (Input.GetMouseButton(1) && isPanningMouse) { Vector3 currentMousePos = Input.mousePosition; Vector3 delta = currentMousePos - lastMousePanPosition; lastMousePanPosition = currentMousePos; // déplacement en écran → translation du Draw2D Pan(delta * mousePanSpeed); } // fin du drag if (Input.GetMouseButtonUp(0)) { isPanningMouse = false; } } // ---------- TOUCH : PINCH ZOOM + PAN 1 DOIGT ---------- void HandleTouchZoomAndPan() { // Aucun touch → rien à faire if (Input.touchCount == 0) return; // --- PINCH 2 DOIGTS --- if (Input.touchCount == 2) { Touch touchZero = Input.GetTouch(0); Touch touchOne = Input.GetTouch(1); Vector2 prevPosZero = touchZero.position - touchZero.deltaPosition; Vector2 prevPosOne = touchOne.position - touchOne.deltaPosition; float prevMagnitude = (prevPosZero - prevPosOne).magnitude; float currentMagnitude = (touchZero.position - touchOne.position).magnitude; float difference = currentMagnitude - prevMagnitude; // > 0 = zoom in float factor = 1f + (difference * pinchZoomSpeed); ApplyZoomFactor(factor); // quand 2 doigts, on ne pan pas return; } // --- PAN 1 DOIGT --- if (Input.touchCount == 1) { Touch touch = Input.GetTouch(0); if (touch.phase == TouchPhase.Moved) { Vector2 delta = touch.deltaPosition; Pan(delta * touchPanSpeed); } } } // ---------- APPLIQUER LE ZOOM ---------- void ApplyZoomFactor(float factor) { if (Draw2D == null) return; Vector3 currentScale = Draw2D.localScale; float newScale = currentScale.x * factor; newScale = Mathf.Clamp(newScale, minScale, maxScale); Draw2D.localScale = new Vector3(newScale, newScale, 1f); } // ---------- APPLIQUER LE PAN ---------- void Pan(Vector2 screenDelta) { if (Draw2D == null) return; // Pour un Canvas en Screen Space Overlay, // déplacer directement la position fonctionne bien. // On peut inverser l’axe Y si le sens est inversé. Vector3 delta = new Vector3(screenDelta.x, screenDelta.y, 0f); Draw2D.position += delta; } }