using UnityEngine; using UnityEngine.EventSystems; namespace UVC.Edit { public class InteractionController : MonoBehaviour { public static event System.Action 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(out var target)) { SetSelectedObject(target); return; } } // 2D 객체 선택 (Physics2D Raycast) - 필요 시 카메라 설정에 따라 추가 // RaycastHit2D hit2D = Physics2D.GetRayIntersection(ray); // if (hit2D.collider != null && hit2D.collider.TryGetComponent(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(); } } } }