69 lines
3.0 KiB
C#
69 lines
3.0 KiB
C#
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;
|
||
}
|
||
}
|