TH1/Unity/Assets/Scripts/UI/UIBlockCameraDrag.cs
2025-07-17 18:26:28 +08:00

69 lines
3.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}