using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.XR.ARFoundation; using UnityEngine.XR.ARSubsystems; namespace Assets.Scripts.Furniture { public class FurnitureDragger : MonoBehaviour { private Camera _mainCamera; private ARRaycastManager _arRaycastManager; private bool _isDragging; private bool _isRotating; private Vector2 _initialTouchPosition; private float _initialRotation; private void Start() { _mainCamera = Camera.main; _arRaycastManager = FindFirstObjectByType(); } private void Update() { if (Input.touchCount == 1) { HandleDrag(); } else if (Input.touchCount == 2) { HandleRotate(); } } private void HandleRotate() { Touch touch = Input.GetTouch(0); if (touch.phase == TouchPhase.Began) { Ray ray = _mainCamera.ScreenPointToRay(touch.position); if (Physics.Raycast(ray, out RaycastHit hit) && hit.transform == transform) { _isDragging = true; } } else if (touch.phase == TouchPhase.Moved && _isDragging) { List hits = new(); if (_arRaycastManager.Raycast(touch.position, hits, TrackableType.PlaneWithinPolygon)) { Pose hitPose = hits[0].pose; transform.position = hitPose.position; } } else if (touch.phase == TouchPhase.Ended || touch.phase == TouchPhase.Canceled) { } { _isDragging = false; } } private void HandleDrag() { Touch touch1 = Input.GetTouch(0); Touch touch2 = Input.GetTouch(1); if (touch1.phase == TouchPhase.Began || touch2.phase == TouchPhase.Began) { // Registrar el ángulo inicial para la rotación Vector2 initialVector = touch2.position - touch1.position; _initialRotation = Mathf.Atan2(initialVector.y, initialVector.x) * Mathf.Rad2Deg; } else if (touch1.phase == TouchPhase.Moved || touch2.phase == TouchPhase.Moved) { // Calcular el ángulo actual Vector2 currentVector = touch2.position - touch1.position; float currentRotation = Mathf.Atan2(currentVector.y, currentVector.x) * Mathf.Rad2Deg; // Calcular la diferencia de ángulo y aplicar la rotación float deltaRotation = currentRotation - _initialRotation; transform.Rotate(Vector3.up, deltaRotation, Space.World); // Actualizar el ángulo inicial _initialRotation = currentRotation; } } } }