using UnityEngine;
///
/// Utility component to forward mouse or touch input to clicked gameobjects.
/// Calls OnPress, OnClick and OnRelease methods on "first" game object.
///
public class InputToEvent : MonoBehaviour
{
private GameObject lastGo;
public static Vector3 inputHitPos;
public bool DetectPointedAtGameObject;
public static GameObject goPointedAt { get; private set; }
private Vector2 pressedPosition = Vector2.zero;
private Vector2 currentPos = Vector2.zero;
public bool Dragging;
private Camera m_Camera;
public Vector2 DragVector
{
get { return this.Dragging ? this.currentPos - pressedPosition : Vector2.zero; }
}
void Start()
{
m_Camera = GetComponent();
}
// Update is called once per frame
void Update()
{
if( DetectPointedAtGameObject )
{
goPointedAt = RaycastObject( Input.mousePosition );
}
if( Input.touchCount > 0 )
{
Touch touch = Input.GetTouch( 0 );
this.currentPos = touch.position;
if( touch.phase == TouchPhase.Began )
{
Press( touch.position );
}
else if( touch.phase == TouchPhase.Ended )
{
Release( touch.position );
}
return;
}
currentPos = Input.mousePosition;
if( Input.GetMouseButtonDown( 0 ) )
{
Press( Input.mousePosition );
}
if( Input.GetMouseButtonUp( 0 ) )
{
Release( Input.mousePosition );
}
if( Input.GetMouseButtonDown( 1 ) )
{
pressedPosition = Input.mousePosition;
lastGo = RaycastObject( pressedPosition );
if( lastGo != null )
{
lastGo.SendMessage( "OnPressRight", SendMessageOptions.DontRequireReceiver );
}
}
}
private void Press( Vector2 screenPos )
{
pressedPosition = screenPos;
this.Dragging = true;
lastGo = RaycastObject( screenPos );
if( lastGo != null )
{
lastGo.SendMessage( "OnPress", SendMessageOptions.DontRequireReceiver );
}
}
private void Release( Vector2 screenPos )
{
if( lastGo != null )
{
GameObject currentGo = RaycastObject( screenPos );
if( currentGo == lastGo ) lastGo.SendMessage( "OnClick", SendMessageOptions.DontRequireReceiver );
lastGo.SendMessage( "OnRelease", SendMessageOptions.DontRequireReceiver );
lastGo = null;
}
pressedPosition = Vector2.zero;
this.Dragging = false;
}
private GameObject RaycastObject( Vector2 screenPos )
{
RaycastHit info;
if( Physics.Raycast( m_Camera.ScreenPointToRay( screenPos ), out info, 200 ) )
{
inputHitPos = info.point;
return info.collider.gameObject;
}
return null;
}
}