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 ( )
{
2025-08-24 18:59:40 +08:00
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 ( )
{
2025-08-24 18:59:40 +08:00
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
}
}