using System; using UnityEngine; using UnityEngine.EventSystems; public class MouseInputManager : MonoBehaviour { [SerializeField] private LayerMask _selectableLayerMask; [SerializeField] private LayerMask _walkableLayerMask; [SerializeField] private Camera _camera; [SerializeField] private WaypointVisual _waypointVisual; public event EventHandler OnSelectedObjectChanged; public static MouseInputManager Instance { get; private set; } private void Awake() { if (Instance != null) { Debug.Log("There's more than one mouse Input instance"); } Instance = this; } void Update() { var ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (!EventSystem.current.IsPointerOverGameObject() && Physics.Raycast(ray, out var mouseRaycastHit, 100f, _selectableLayerMask)) { mouseRaycastHit.transform.TryGetComponent(out BaseInteractableObject baseObject); if (baseObject != null) { OnSelectedObjectChanged?.Invoke(this, new OnSelectedObjectChangedEventArgs() { SelectedObject = baseObject }); if (Input.GetMouseButtonDown(0)) { _waypointVisual.SetWaypoint(baseObject._playerArrivePoint.position); Player.Instance.AddTask(new PlayerTasks(Tasks.Interact, baseObject)); } } else { OnSelectedObjectChanged?.Invoke(this, new OnSelectedObjectChangedEventArgs() { SelectedObject = null }); } } else { OnSelectedObjectChanged?.Invoke(this, new OnSelectedObjectChangedEventArgs() { SelectedObject = null }); if (Input.GetMouseButtonDown(0)) { if (Physics.Raycast(_camera.ScreenPointToRay(Input.mousePosition), out RaycastHit hit, 100f, _walkableLayerMask)) { _waypointVisual.SetWaypoint(hit.point); Player.Instance.AddTask(new PlayerTasks(Tasks.Move, _waypointVisual)); } } } } }