95 lines
3.0 KiB
C#
95 lines
3.0 KiB
C#
using Assets.Scripts.Furniture;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.XR.ARFoundation;
|
|
using UnityEngine.XR.ARSubsystems;
|
|
|
|
public class FurnitureManager : MonoBehaviour
|
|
{
|
|
[SerializeField] private ARRaycastManager arRaycastManager; // Para detectar superficies
|
|
[SerializeField] private List<GameObject> furniturePrefabs; // Lista de prefabs de muebles
|
|
[SerializeField] private GameObject furniturePreviewPrefab; // Prefab para previsualización
|
|
|
|
private GameObject _currentPreview;
|
|
private GameObject _currentFurniturePrefab;
|
|
private Vector3 _detectedPosition = Vector3.zero;
|
|
private Quaternion _detectedRotation = Quaternion.identity;
|
|
private bool _canAddFurniture = false;
|
|
|
|
private void Start()
|
|
{
|
|
// Establece el primer mueble como predeterminado
|
|
if (furniturePrefabs.Count > 0)
|
|
{
|
|
SetSelectedFurniture(furniturePrefabs[0]);
|
|
}
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
DetectPlaneAndUpdatePreview();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Método para detectar planos y actualizar la posición de previsualización.
|
|
/// </summary>
|
|
private void DetectPlaneAndUpdatePreview()
|
|
{
|
|
if (_currentPreview == null) return;
|
|
|
|
var hits = new List<ARRaycastHit>();
|
|
var middleScreen = new Vector2(Screen.width / 2, Screen.height / 2);
|
|
|
|
if (arRaycastManager.Raycast(middleScreen, hits, TrackableType.PlaneWithinPolygon))
|
|
{
|
|
_detectedPosition = hits[0].pose.position;
|
|
_detectedRotation = hits[0].pose.rotation;
|
|
|
|
_currentPreview.transform.SetPositionAndRotation(_detectedPosition, _detectedRotation);
|
|
_currentPreview.SetActive(true);
|
|
|
|
_canAddFurniture = true;
|
|
}
|
|
else
|
|
{
|
|
_currentPreview.SetActive(false);
|
|
_canAddFurniture = false;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Método para colocar un mueble en la posición detectada.
|
|
/// </summary>
|
|
public void PlaceFurniture()
|
|
{
|
|
if (!_canAddFurniture || _currentFurniturePrefab == null) return;
|
|
|
|
var newFurniture = Instantiate(_currentFurniturePrefab);
|
|
newFurniture.transform.SetPositionAndRotation(_detectedPosition, _detectedRotation);
|
|
|
|
// Añadir funcionalidad de manipulación (rotar, mover, etc.)
|
|
newFurniture.AddComponent<FurnitureDragger>();
|
|
|
|
Debug.Log("Mueble colocado en la posición detectada.");
|
|
}
|
|
|
|
/// <summary>
|
|
/// Cambiar el prefab del mueble seleccionado.
|
|
/// </summary>
|
|
/// <param name="furniturePrefab">Prefab del mueble seleccionado.</param>
|
|
public void SetSelectedFurniture(GameObject furniturePrefab)
|
|
{
|
|
_currentFurniturePrefab = furniturePrefab;
|
|
|
|
// Actualizar el preview
|
|
if (_currentPreview != null)
|
|
{
|
|
Destroy(_currentPreview);
|
|
}
|
|
|
|
_currentPreview = Instantiate(furniturePreviewPrefab ?? furniturePrefab);
|
|
_currentPreview.SetActive(false);
|
|
}
|
|
}
|