64 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Collections.Generic;
 | |
| using UnityEngine;
 | |
| using UnityEngine.XR.ARFoundation;
 | |
| using UnityEngine.XR.ARSubsystems;
 | |
| 
 | |
| public class FurnitureSpawner : MonoBehaviour
 | |
| {
 | |
|     [SerializeField] private ARRaycastManager arRaycastManager;
 | |
|     [SerializeField] private GameObject furniturePrefab;
 | |
| 
 | |
|     private bool _canAddFurniture;
 | |
|     private GameObject _furniturePreview;
 | |
|     private Vector3 _detectedPosition = new();
 | |
|     private Quaternion _detectedRotation = Quaternion.identity;
 | |
|     private ARTrackable _currentTrackable = null;
 | |
| 
 | |
|     private void Start()
 | |
|     {
 | |
|         InputHandler.OnTap += SpawnFurniture;
 | |
|         _furniturePreview = Instantiate(furniturePrefab);
 | |
|         SetCanAddFurniture(true);
 | |
|     }
 | |
| 
 | |
|     private void SpawnFurniture()
 | |
|     {
 | |
|         if (!_canAddFurniture) return;
 | |
| 
 | |
|         var furniture = Instantiate(furniturePrefab);
 | |
| 
 | |
|         furniture.GetComponent<Furniture>().PlaceFurniture(_currentTrackable);
 | |
|         furniture.transform.SetPositionAndRotation(_detectedPosition, _detectedRotation);
 | |
|     }
 | |
| 
 | |
|     private void Update()
 | |
|     {
 | |
|         // Detect a position and rotation over the detected surface
 | |
|         GetRaycastHitTransform();
 | |
|     }
 | |
| 
 | |
|     private void GetRaycastHitTransform()
 | |
|     {
 | |
|         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;
 | |
|             _furniturePreview.transform.SetPositionAndRotation(_detectedPosition, _detectedRotation);
 | |
|             _currentTrackable = hits[0].trackable;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private void OnDestroy()
 | |
|     {
 | |
|         InputHandler.OnTap -= SpawnFurniture;
 | |
|     }
 | |
| 
 | |
|     private void SetCanAddFurniture(bool canAddFurniture)
 | |
|     {
 | |
|         _canAddFurniture = canAddFurniture;
 | |
|         _furniturePreview.SetActive(canAddFurniture);
 | |
|     }
 | |
| }
 | 
