using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using System.Collections.Generic; using FairyGUI; using Roy; public class UIScreenTapTrigger : SingletonMonoBehaviour { public Canvas canvas; // 目标 Canvas private GraphicRaycaster raycaster; private EventSystem eventSystem; private RectTransform _canvasRect; private float _scaleX, _scaleY; private float _ignoreY; private void Start() { // 获取 Canvas 上的 GraphicRaycaster 和 EventSystem raycaster = canvas.GetComponent(); eventSystem = EventSystem.current; _canvasRect = canvas.GetComponent(); // 分别计算 X 和 Y 方向的缩放因子 _scaleX = Screen.width / _canvasRect.sizeDelta.x; _scaleY = Screen.height / _canvasRect.sizeDelta.y; } public void SetIgnoreY(float ignoreY) { _ignoreY = ignoreY; } // 将 iOS 的比例坐标转换为 Unity 坐标 private Vector2 ConvertToUnityPosition(Vector2 ratioPosition) { // Debug.LogError($"转换canvasRect size{_canvasRect.sizeDelta.x}, {_canvasRect.sizeDelta.y} "); // Debug.LogError($"转换screen{Screen.width}x{Screen.height} 当前scale{_scaleX}x{_scaleY}" ); // 计算屏幕坐标并翻转 Y 轴 float x = ratioPosition.x * _canvasRect.sizeDelta.x * _scaleX; float y = (1 - ratioPosition.y) * _canvasRect.sizeDelta.y * _scaleY; return new Vector2(x, y); } // 检测特定屏幕坐标的 UI 按钮并触发 public bool TriggerButtonAtScreenPosition(Vector2 screenPosition) { // Debug.LogError($"转换前比例{screenPosition}"); screenPosition = ConvertToUnityPosition(screenPosition); if (screenPosition.y < _ignoreY) { Debug.LogError($"TouchClickPoint 忽略当前高度{screenPosition.y} 限制范围Y{_ignoreY}"); return false; } // Debug.LogError($"转换后坐标{screenPosition}"); // 设置射线检测的事件数据 PointerEventData pointerEventData = new PointerEventData(eventSystem) { position = screenPosition }; // 用于存储检测结果 List results = new List(); // 对屏幕坐标进行射线检测 raycaster.Raycast(pointerEventData, results); // 遍历检测结果 foreach (RaycastResult result in results) { var target = result.gameObject.GetComponent