using UnityEngine; using UnityEngine.EventSystems; // 为避免潜在的冲突和更清晰的逻辑,建议将类名稍作更改,以反映其新功能 // 例如:UIMouseBlocker,或者就保持 UIBlockCameraDrag 也可以,只要功能上能理解 public class UIBlockCameraDrag : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler, IPointerUpHandler { // 是否当前鼠标指针在UI上(用于滚轮等瞬时判断) public static bool IsPointerOnUI = false; // 是否应该阻止游戏中的拖动操作(用于点击并拖动的情况) // 当鼠标在UI上按下时设为true,鼠标抬起时设为false public static bool ShouldBlockDrag = false; // --- IPointerEnterHandler --- public void OnPointerEnter(PointerEventData eventData) { IsPointerOnUI = true; } // --- IPointerExitHandler --- public void OnPointerExit(PointerEventData eventData) { IsPointerOnUI = false; // 当鼠标移出UI时,如果不是因为正在拖动而被阻止(即不是因为鼠标在UI上按下), // 并且鼠标已经抬起,那么 ShouldBlockDrag 应该被重置。 // 但为了简单和可靠,我们主要依赖 OnPointerUp 来重置 ShouldBlockDrag。 // 所以这里可以不用特别处理 ShouldBlockDrag。 } // --- IPointerDownHandler --- public void OnPointerDown(PointerEventData eventData) { // 仅当左键按下时才处理 if (eventData.button == PointerEventData.InputButton.Left) { //Debug.Log("Check is down"); // 鼠标在UI上按下左键,则阻止任何潜在的拖动操作 ShouldBlockDrag = true; } } // --- IPointerUpHandler --- public void OnPointerUp(PointerEventData eventData) { // 仅当左键按下时才处理 if (eventData.button == PointerEventData.InputButton.Left) { //Debug.Log("Check is up"); // 鼠标在UI上按下左键,则阻止任何潜在的拖动操作 //ShouldBlockDrag = false; } } // 确保在禁用或销毁时重置静态变量,以防万一 void OnDisable() { // 这里需要更谨慎。因为静态变量是全局的,如果场景中有多个UIBlockCameraDrag实例, // 某个实例的禁用或销毁不应该轻易重置由其他实例设置的全局状态。 // 但为了安全起见,如果在没有其他UI元素会阻止拖动的情况下,可以考虑在这里重置。 // 更安全的做法是:在游戏关闭前或重要状态切换时(比如加载新场景)进行统一重置。 // Untuk tujuan demonstrasi ini, kita tidak akan reset IsPointerOnUI dan ShouldBlockDrag di OnDisable. // 如果只有一个UIBlockCameraDrag实例或者所有实例都是同时存在的,那么可以考虑: // IsPointerOnUI = false; // ShouldBlockDrag = false; } }