using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; namespace Game.RayCast; public class MouseInput : MonoBehaviour { public RayCastType rayCastType = RayCastType._2D; MouseInputData mouseInputData = new MouseInputData(); // public event MouseInputEventHandle ev; private void Update() { if (this.IsMouseOverUI()) return; switch (rayCastType) { case RayCastType._3D: // 3d Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { if (hit.collider != null) { Debug.Log(hit.collider.name); } } break; case RayCastType._2D: //2d var point = Camera.main.ScreenToWorldPoint(Input.mousePosition); var hit2D = Physics2D.Raycast(point, -Vector2.up); if (hit2D.collider != null) { if (Input.GetMouseButtonDown(0)) { UnityEngine.Debug.Log(hit2D.collider.name); mouseInputData.rayCastType = this.rayCastType; mouseInputData.point = hit2D.point; mouseInputData.isPressDown = true; mouseInputData.go = hit2D.collider.gameObject; EventManager.Instance.FireNow(this, new InputObjectFinishEventArgs(mouseInputData)); } else if (Input.GetMouseButtonDown(2)) { // Game.bfsManager.Test(hit2D.point); } } break; default: throw new ArgumentOutOfRangeException(); } } private bool IsMouseOverUI() { PointerEventData eventData = new PointerEventData(EventSystem.current) { position = Input.mousePosition }; List results = new List(); EventSystem.current.RaycastAll(eventData, results); foreach (var result in results) { // 检查射线检测到的对象是否为UI元素,并且是否属于CanvasGroup CanvasGroup canvasGroup = result.gameObject.GetComponentInParent(); if (canvasGroup != null) { // 如果CanvasGroup不允许交互或不阻挡射线,我们认为鼠标不是位于UI上 if (!canvasGroup.interactable || !canvasGroup.blocksRaycasts) { continue; } } // 如果找到至少一个允许交互且阻挡射线的UI元素,返回true return true; } // 如果所有射线检测到的UI元素都不允许交互或不阻挡射线,返回false return false; } } public enum RayCastType { _3D, _2D, } public class MouseInputData { public RayCastType rayCastType; public bool isPressDown; public Vector3 point; public GameObject go; }