151 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 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<ARRaycastManager>();
 | |
|             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<ARAnchorManager>();
 | |
|             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<ARRaycastHit> hits = new List<ARRaycastHit>();
 | |
|             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);
 | |
|         }
 | |
|     }
 | |
| }
 | 
