Files
XRLib/Assets/Scripts/UVC/Edit/InteractionController.cs
2025-06-19 19:24:30 +09:00

78 lines
2.3 KiB
C#

using UnityEngine;
using UnityEngine.EventSystems;
namespace UVC.Edit
{
public class InteractionController : MonoBehaviour
{
public static event System.Action<EditableObject> OnObjectSelected;
public static event System.Action OnBackgroundClicked;
private Camera _mainCamera;
private EditableObject _selectedObject;
void Awake()
{
_mainCamera = Camera.main;
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
// UI 위에서 클릭했는지 먼저 확인
if (EventSystem.current.IsPointerOverGameObject())
{
return; // UI 클릭 시 월드 객체 선택 방지
}
HandleSelection();
}
}
private void HandleSelection()
{
Ray ray = _mainCamera.ScreenPointToRay(Input.mousePosition);
// 3D 객체 선택 (Physics Raycast)
if (Physics.Raycast(ray, out RaycastHit hit))
{
// EditableObject 컴포넌트를 가진 객체인지 확인
if (hit.collider.TryGetComponent<EditableObject>(out var target))
{
SetSelectedObject(target);
return;
}
}
// 2D 객체 선택 (Physics2D Raycast) - 필요 시 카메라 설정에 따라 추가
// RaycastHit2D hit2D = Physics2D.GetRayIntersection(ray);
// if (hit2D.collider != null && hit2D.collider.TryGetComponent<EditableObject>(out var target2D))
// {
// SetSelectedObject(target2D);
// return;
// }
// 아무것도 선택되지 않았을 경우
SetSelectedObject(null);
}
private void SetSelectedObject(EditableObject target)
{
if (_selectedObject == target) return;
_selectedObject?.OnDeselect();
_selectedObject = target;
_selectedObject?.OnSelect();
if (_selectedObject != null)
{
OnObjectSelected?.Invoke(_selectedObject);
}
else
{
OnBackgroundClicked?.Invoke();
}
}
}
}