78 lines
2.3 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|
|
}
|