oddlyzen
2/6/2011 - 11:37 PM

iPhoneSwipeGestureForUnity.m

public int deviationAmount = 20;
public ArrayList trackers = new ArrayList();
Hashtable trackerLookup = new Hashtable();
private ArrayList ended;
private TouchTracker tracker;
private ArrayList movements;
....
void Update () {
		// clean all touches (so they know if they aren't updated after we pull info)
		for(i=0;i<trackers.Count;i++)
			((TouchTracker)trackers[i]).Clean();
		// track which events vanished (without using iPhoneTouchPhase.Ended)
		ended = new ArrayList();
			// process our touches
		for(i = 0;i<iPhoneInput.touches.Length;i++)
		{			
			// iPhoneTouchPhase.Ended isn't very reliable (especially with the remote)
			// but this is how we can tell if we got single or double finger taps
			if(iPhoneInput.touches[i].phase == iPhoneTouchPhase.Ended && iPhoneInput.touches[i].tapCount>0)
			{
				if(iPhoneInput.touchCount == 1)
				{
					//Debug.Log("tracker.tapCount="+touch.tapCount);
					this.HandleSingleTap();
					return;
				}
				if(iPhoneInput.touchCount == 2 && iPhoneInput.touches[i].fingerId == 1)
				{
					//Debug.Log("tracker.tapCount="+touch.tapCount);
					this.HandleTwoFingerTap();
					return;
				}
			}
			else
			{
				// try to get our tracker for this finger id
				tracker = (TouchTracker)trackerLookup[iPhoneInput.touches[i].fingerId];
			
				if(tracker != null)
					tracker.Update(iPhoneInput.touches[i]);
				else
					tracker = BeginTracking(iPhoneInput.touches[i]);
			}
			
		}
		// use an intermediate list because EndTracking removes from trackers arraylist
		for(i=0;i<trackers.Count;i++)
		{
			if(!((TouchTracker)trackers[i]).isDirty)
				ended.Add(trackers[i]);
		}
		movements = new ArrayList();
		for(i=0;i<ended.Count;i++)
		{
			movements.Add(EndTracking((TouchTracker)ended[i]));
		}
		if(movements.Count == 0)
			return;
		
		//Debug.Log("movements.Count="+movements.Count);
		//single finger swipe and only do it if we have finished all trackers
		if(movements.Count == 1 && trackers.Count==0)
		{
			this.HandleSingleSwipe((Vector2)movements[0]);
		}
		//two finger swipe and only do it if we have finished all trackers
		else if(movements.Count == 2 && trackers.Count==0)
		{
			this.HandleTwoFingerSwipe((Vector2)movements[0],(Vector2)movements[1]);
		}
}
....
void HandleSingleSwipe(Vector2 movement)
{
		if(IsSwipeRight(movement))
		{
			//Debug.Log("Single Finger Swipe Right");
		}
}
....
	bool IsSwipeRight(Vector2 movement)
	{
		if(movement.x > deviationAmount && Mathf.Abs(movement.y) < deviationAmount)
			return true;
		return false;
	}
	TouchTracker BeginTracking(iPhoneTouch touch)
	{
		TouchTracker tracker = new TouchTracker(touch);
	
		// remember our tracker
		trackers.Add(tracker);
		trackerLookup[touch.fingerId] = tracker;
	
		return tracker;
	}
	Vector2 EndTracking(TouchTracker tracker)
	{
		Vector2 movement = tracker.End();

		trackers.Remove(tracker);
		trackerLookup[tracker.fingerId] = null;
		return movement;
	}  

.....

using UnityEngine;
using System.Collections;

public class Swipe : MonoBehaviour {

//public member vars
public int swipeLength;
public int swipeVariance;
//private member vars
private GUIText swipeText;
private Vector2[] fingerTrackArray;
private bool[] swipeCompleteArray;
private int activeTouch = -1;

//methods
	void Start()
	{
		//get a reference to the GUIText component
		swipeText = (GUIText) GetComponent(typeof(GUIText));
		fingerTrackArray = new Vector2[5];
		swipeCompleteArray = new bool[5];
	}	

	void Update()
	{
		//touch count is a mess at the moment so add the extra check to see if there are no more than 5 touches
		if(iPhoneInput.touchCount > 0 && iPhoneInput.touchCount < 6)
		{
			foreach(iPhoneTouch touch in iPhoneInput.touches)
			{
				if(touch.phase == iPhoneTouchPhase.Began)
				{
					fingerTrackArray[touch.fingerId] = touch.position;	
				}
				//check if withing swipe variance		
				if(touch.position.y > (fingerTrackArray[touch.fingerId].y + swipeVariance))
					fingerTrackArray[touch.fingerId] = touch.position;
				if(touch.position.y < (fingerTrackArray[touch.fingerId].y - swipeVariance))
					fingerTrackArray[touch.fingerId] = touch.position;
				//swipe right
				if((touch.position.x > fingerTrackArray[touch.fingerId].x + swipeLength) && !swipeCompleteArray[touch.fingerId] 
					&& activeTouch == -1) 
				{
					activeTouch = touch.fingerId;
					//Debug.Log(touch.fingerId + " " + fingerTrackArray[touch.fingerId] + " " +  touch.position);
					swipeCompleteArray[touch.fingerId] = true;
					SwipeComplete("swipe right  ",  touch);
				}
				//swipe left
				if((touch.position.x < fingerTrackArray[touch.fingerId].x - swipeLength) && !swipeCompleteArray[touch.fingerId] 
					&& activeTouch == -1)
				{
					activeTouch = touch.fingerId;
					//Debug.Log(touch.fingerId + " " + fingerTrackArray[touch.fingerId] + " " +  touch.position);
					swipeCompleteArray[touch.fingerId] = true;
					SwipeComplete("swipe left  ", touch);
				}
				//when the touch has ended we can start accepting swipes again
				if(touch.fingerId == activeTouch && touch.phase == iPhoneTouchPhase.Ended)
				{
					//Debug.Log("Ending " + touch.fingerId);
					//if more than one finger has swiped then reset the other fingers so
					//you do not get a double/triple etc. swipe
					foreach(iPhoneTouch touchReset in iPhoneInput.touches)
					{
						fingerTrackArray[touchReset.fingerId] = touchReset.position;	
					}
					swipeCompleteArray[touch.fingerId] = false;
					activeTouch = -1;
				}
			}			
		}	
	}
	
	void SwipeComplete(string messageToShow, iPhoneTouch touch)
	{
		
		swipeText.text = messageToShow;
		//Debug.Log("doing something");
		//Do something here
	}
	

}