using System; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.InputSystem; public class InGameMouseHandler : MonoBehaviour { [SerializeField] private LayerMask _selectableLayerMask; [SerializeField] private LayerMask _walkableLayerMask; [SerializeField] private WaypointVisual _waypointVisual; [SerializeField] private Camera _camera; private Ray _ray; public static event EventHandler OnSelectedObjectChanged; private BaseInteractableObject _selectedObject; private void Start() { InputManager.Instance.PlayerAction.PointClick.performed += ClickToMove; } private void OnDestroy() { InputManager.Instance.PlayerAction.PointClick.performed += ClickToMove; } private void ClickToMove(InputAction.CallbackContext context) { if (!EventSystem.current.IsPointerOverGameObject()) { if (_selectedObject != null) { print($"Go to interaction point {_selectedObject._interactionPoint.position}"); _waypointVisual.SetWaypoint(_selectedObject._interactionPoint.position); Player.Instance.AddTask(new PlayerTasks(Tasks.Interact, _selectedObject)); } else { if (Physics.Raycast(_ray, out RaycastHit hit, 100f, _walkableLayerMask)) { print($"hit point {hit.point} collider pos {hit.collider.transform.position}"); _waypointVisual.SetWaypoint(hit.point); Player.Instance.AddTask(new PlayerTasks(Tasks.Move, _waypointVisual)); } } } } void Update() { _ray = _camera.ScreenPointToRay(Mouse.current.position.ReadValue()); if(EventSystem.current.IsPointerOverGameObject()) { return; } //hide rounded menu if (Physics.Raycast(_ray, out var mouseRaycastHit, 100f, _selectableLayerMask)) { mouseRaycastHit.transform.TryGetComponent(out _selectedObject); if (_selectedObject != null) { OnSelectedObjectChanged?.Invoke(this, new OnSelectedObjectChangedEventArgs() { SelectedObject = _selectedObject }); } else { OnSelectedObjectChanged?.Invoke(this, new OnSelectedObjectChangedEventArgs() { SelectedObject = null }); } } else { OnSelectedObjectChanged?.Invoke(this, new OnSelectedObjectChangedEventArgs() { SelectedObject = null }); } } }