using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.XR.ARFoundation; using UnityEngine.XR.ARSubsystems; public class DragAndDropManager : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler { public GameObject prefabToInstance; public GameObject gridPrefab; // Prefab del grid de detección private ARRaycastManager arRaycastManager; private ARAnchorManager arAnchorManager; // Se agrega ARAnchorManager para fijar los objetos private Camera arCamera; private GameObject draggedObject; private GameObject gridIndicator; // Instancia del grid void Start() { if (arRaycastManager == null) { arRaycastManager = FindObjectOfType(); if (arRaycastManager == null) { Debug.LogError("ARRaycastManager no está en la escena. Asegúrate de agregarlo."); } } if (arCamera == null) { arCamera = Camera.main; if (arCamera == null) { Debug.LogError("Cámara AR no encontrada. Asegúrate de que haya una cámara en la escena."); } } if (arAnchorManager == null) { arAnchorManager = FindObjectOfType(); if (arAnchorManager == null) { Debug.LogError("ARAnchorManager no está en la escena."); } } } public void SetCamera(Camera camera) { if (camera == null) { Debug.LogError("Cámara proporcionada es nula."); return; } arCamera = camera; if (arCamera.nearClipPlane <= 0.01f) { arCamera.nearClipPlane = 0.1f; Debug.Log("nearClipPlane de la cámara ajustado a 0.1"); } } public void SetARRaycastManager(ARRaycastManager raycastManager) { if (raycastManager == null) { Debug.LogError("ARRaycastManager proporcionado es nulo."); return; } arRaycastManager = raycastManager; } public void SetARAnchorManager(ARAnchorManager anchorManager) { if (anchorManager == null) { Debug.LogError("ARAnchorManager proporcionado es nulo."); return; } arAnchorManager = anchorManager; } public void OnBeginDrag(PointerEventData eventData) { if (prefabToInstance != null) { draggedObject = Instantiate(prefabToInstance); draggedObject.SetActive(false); } // Crear el grid de detección if (gridPrefab != null) { gridIndicator = Instantiate(gridPrefab); gridIndicator.SetActive(false); } } public void OnDrag(PointerEventData eventData) { if (draggedObject != null && arRaycastManager != null && arCamera != null) { List hits = new List(); if (arRaycastManager.Raycast(eventData.position, hits, TrackableType.Planes)) { var hitPose = hits[0].pose; // Colocar el objeto en la posición AR detectada draggedObject.transform.position = hitPose.position; draggedObject.transform.rotation = hitPose.rotation; draggedObject.SetActive(true); // Mostrar el grid en la posición detectada if (gridIndicator != null) { gridIndicator.transform.position = hitPose.position; gridIndicator.SetActive(true); } } } } public void OnEndDrag(PointerEventData eventData) { if (draggedObject != null && arAnchorManager != null) { // Agregar un anclaje al objeto para fijarlo en su lugar ARAnchor anchor = arAnchorManager.AddAnchor(new Pose(draggedObject.transform.position, draggedObject.transform.rotation)); if (anchor != null) { draggedObject.transform.SetParent(anchor.transform); // Hacer que el objeto sea hijo del anclaje } else { Debug.LogWarning("No se pudo crear un ARAnchor. El objeto podría moverse."); } draggedObject = null; } // Ocultar el grid una vez colocado el objeto if (gridIndicator != null) { Destroy(gridIndicator); } } }