?
主要功能說明:
- ?長按檢測:通過記錄指針按下的時間,判斷是否達到?
longClickTime
,從而觸發長按事件。 - ?狀態管理:使用?
StateEnum
?枚舉管理點擊項的當前狀態(未按下、按下等待長按、長按已觸發)。 - ?事件回調:通過實現?
IPointerDownHandler
、IPointerUpHandler
?和?ICancelHandler
?接口,處理 Unity UI 的指針事件。 - ?監聽器事件:用于定義長按事件的監聽器,外部類可以注冊事件以處理長按邏輯。
使用場景:
- 適用于需要檢測長按操作的 UI 元素,例如長按刪除、長按編輯等交互場景。
/****************************************************文件:LongClickable.cs作者:Edision日期:#CreateTime#功能:長按
*****************************************************/
using UnityEngine;
using UnityEngine.UI;
using System;
using UnityEngine.EventSystems;/// <summary>
/// 用于將“長按點擊”事件委托給事件監聽器
/// 需要一個可點擊的圖形組件(可以是透明度為零的圖像)以接收 OnPointerDown、OnPointerUp 等事件。
/// 其他 UI 元素不應覆蓋此組件,以確保能夠接收指針回調。
/// </summary>
[RequireComponent(typeof(Graphic))]
public class LongClickable : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{public float longClickTime = .7f; // 用戶需要按住點擊的時間(秒)以觸發長按事件public event Action<LongClickable> OnLongClick; // 定義長按事件public StateEnum State { get { return _State; } } // 當前點擊項的狀態float _PressedTime; // 指針按下時的時間StateEnum _State; // 當前點擊項的狀態/// <summary>/// 枚舉表示點擊項的不同狀態/// </summary>public enum StateEnum{NOT_PRESSING, // 未按下PRESSING_WAITING_FOR_LONG_CLICK, // 按下,等待是否觸發長按PRESSING_AFTER_LONG_CLICK // 按下,長按已觸發}/// <summary>/// 每幀調用,用于檢查是否達到長按時間/// </summary>void Update(){if (_State == StateEnum.PRESSING_WAITING_FOR_LONG_CLICK){// 檢查自指針按下以來的時間是否超過長按時間if (Time.unscaledTime - _PressedTime >= longClickTime){_State = StateEnum.PRESSING_AFTER_LONG_CLICK; // 更新狀態以指示長按已觸發OnLongClick?.Invoke(this); // 觸發長按事件}}}#region Unity UI 事件處理回調/// <summary>/// 當指針按下時調用/// </summary>/// <param name="eventData">與指針事件相關的數據</param>public void OnPointerDown(PointerEventData eventData){if (eventData.button != PointerEventData.InputButton.Left) // 確保僅處理左鍵點擊return;_State = StateEnum.PRESSING_WAITING_FOR_LONG_CLICK; // 更新狀態以指示項被按下_PressedTime = Time.unscaledTime; // 記錄指針按下的時間}/// <summary>/// 當指針松開時調用/// </summary>/// <param name="eventData">與指針事件相關的數據</param>public void OnPointerUp(PointerEventData eventData){if (eventData.button != PointerEventData.InputButton.Left) // 確保僅處理左鍵松開return;_State = StateEnum.NOT_PRESSING; // 更新狀態以指示項未被按下}#endregion
}
/****************************************************文件:LongClickableItem.cs作者:Edision日期:#CreateTime#功能:UI 元素
*****************************************************/
using UnityEngine;[RequireComponent(typeof(LongClickable))]
public class LongClickableItem : MonoBehaviour
{private void Awake(){LongClickable item = GetComponent<LongClickable>();item.OnLongClick += HandleLongClick;}void HandleLongClick(LongClickable clickedItem){Debug.Log("長按事件觸發!");}
}