FM/Assets/TouchScript/Scripts/Behaviors/UI/OverHelper.cs

151 lines
4.8 KiB
C#
Raw Normal View History

2025-06-04 22:49:37 +08:00
/*
* @author Valentin Simonov / http://va.lent.in/
*/
using System;
using System.Collections.Generic;
using TouchScript.Pointers;
using TouchScript.Utils;
using UnityEngine;
namespace TouchScript.Behaviors.UI
{
/// <summary>
/// This component listens for pointer events and dispatches <see cref="Over"/> event when the first touch enters the area of the GameObject it is attached to and <see cref="Out"/> event when the last touch leaves it.
/// </summary>
[AddComponentMenu("TouchScript/Behaviors/OverHelper")]
[HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_UI_OverHelper.htm")]
public class OverHelper : MonoBehaviour
{
#region Events
/// <summary>
/// Occurs when the first (non-pressed) touch enters the area of the GameObject.
/// </summary>
public event EventHandler Over;
/// <summary>
/// Occurs when the last touch leaves the area of the GameObject.
/// </summary>
public event EventHandler Out;
#endregion
#region Private variable
private HashSet<int> pointers = new HashSet<int>();
#endregion
#region Unity methods
private void OnEnable()
{
var touchManager = TouchManager.Instance;
if (touchManager == null) return;
touchManager.PointersAdded += pointersAddedHandler;
touchManager.PointersUpdated += pointersUpdatedHandler;
touchManager.PointersReleased += pointersReleasedHandler;
touchManager.PointersRemoved += pointersRemovedHandler;
touchManager.PointersCancelled += pointersRemovedHandler;
2025-06-04 22:49:37 +08:00
}
private void OnDisable()
{
var touchManager = TouchManager.Instance;
if (touchManager == null) return;
touchManager.PointersAdded -= pointersAddedHandler;
touchManager.PointersUpdated -= pointersUpdatedHandler;
touchManager.PointersReleased -= pointersReleasedHandler;
touchManager.PointersRemoved -= pointersRemovedHandler;
touchManager.PointersCancelled -= pointersRemovedHandler;
2025-06-04 22:49:37 +08:00
}
#endregion
#region Private functions
private void dispatchOver()
{
if (Over != null) Over.InvokeHandleExceptions(this, EventArgs.Empty);
}
private void dispatchOut()
{
if (Out != null) Out.InvokeHandleExceptions(this, EventArgs.Empty);
}
#endregion
#region Callbacks
private void pointersAddedHandler(object sender, PointerEventArgs pointerEventArgs)
{
var over = pointers.Count;
var p = pointerEventArgs.Pointers;
var count = p.Count;
for (var i = 0; i < count; i++)
{
var pointer = p[i];
if (PointerUtils.IsPointerOnTarget(pointer, transform)) pointers.Add(pointer.Id);
}
if (over == 0 && pointers.Count > 0) dispatchOver();
}
private void pointersUpdatedHandler(object sender, PointerEventArgs pointerEventArgs)
{
var over = pointers.Count;
var p = pointerEventArgs.Pointers;
var count = p.Count;
for (var i = 0; i < count; i++)
{
var pointer = p[i];
if ((pointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed) != 0) continue; // we ignore pressed pointers
if (PointerUtils.IsPointerOnTarget(pointer, transform)) pointers.Add(pointer.Id);
else pointers.Remove(pointer.Id);
}
if (over == 0 && pointers.Count > 0) dispatchOver();
else if (over > 0 && pointers.Count == 0) dispatchOut();
}
private void pointersReleasedHandler(object sender, PointerEventArgs pointerEventArgs)
{
var over = pointers.Count;
var p = pointerEventArgs.Pointers;
var count = p.Count;
for (var i = 0; i < count; i++)
{
var pointer = p[i];
if (PointerUtils.IsPointerOnTarget(pointer, transform)) pointers.Add(pointer.Id);
else pointers.Remove(pointer.Id);
}
if (over == 0 && pointers.Count > 0) dispatchOver();
else if (over > 0 && pointers.Count == 0) dispatchOut();
}
private void pointersRemovedHandler(object sender, PointerEventArgs pointerEventArgs)
{
var over = pointers.Count;
var p = pointerEventArgs.Pointers;
var count = p.Count;
for (var i = 0; i < count; i++)
{
var pointer = p[i];
pointers.Remove(pointer.Id);
}
if (over > 0 && pointers.Count == 0) dispatchOut();
}
#endregion
}
}