416 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			416 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
	
| /***********************************************
 | |
| 				EasyTouch Controls
 | |
| 	Copyright © 2016 The Hedgehog Team
 | |
|       http://www.thehedgehogteam.com/Forum/
 | |
| 		
 | |
| 	  The.Hedgehog.Team@gmail.com
 | |
| 		
 | |
| **********************************************/
 | |
| using UnityEngine;
 | |
| using UnityEngine.UI;
 | |
| using UnityEngine.Events;
 | |
| using UnityEngine.EventSystems;
 | |
| using System.Collections;
 | |
| 
 | |
| [System.Serializable]
 | |
| public class ETCTouchPad : ETCBase,IBeginDragHandler, IDragHandler,IPointerEnterHandler,  IPointerDownHandler, IPointerUpHandler, IPointerExitHandler {
 | |
| 
 | |
| 	#region Unity Events
 | |
| 	[System.Serializable] public class OnMoveStartHandler : UnityEvent{}
 | |
| 	[System.Serializable] public class OnMoveHandler : UnityEvent<Vector2> { }
 | |
| 	[System.Serializable] public class OnMoveSpeedHandler : UnityEvent<Vector2> { }
 | |
| 	[System.Serializable] public class OnMoveEndHandler : UnityEvent{ }
 | |
| 	
 | |
| 	[System.Serializable] public class OnTouchStartHandler : UnityEvent{}
 | |
| 	[System.Serializable] public class OnTouchUPHandler : UnityEvent{}
 | |
| 	
 | |
| 	[System.Serializable] public class OnDownUpHandler : UnityEvent{ }
 | |
| 	[System.Serializable] public class OnDownDownHandler : UnityEvent{ }
 | |
| 	[System.Serializable] public class OnDownLeftHandler : UnityEvent{ }
 | |
| 	[System.Serializable] public class OnDownRightHandler : UnityEvent{ }
 | |
| 	
 | |
| 	[System.Serializable] public class OnPressUpHandler : UnityEvent{ }
 | |
| 	[System.Serializable] public class OnPressDownHandler : UnityEvent{ }
 | |
| 	[System.Serializable] public class OnPressLeftHandler : UnityEvent{ }
 | |
| 	[System.Serializable] public class OnPressRightHandler : UnityEvent{ }
 | |
| 	
 | |
| 	[SerializeField] public OnMoveStartHandler onMoveStart;
 | |
| 	[SerializeField] public OnMoveHandler onMove;
 | |
| 	[SerializeField] public OnMoveSpeedHandler onMoveSpeed;
 | |
| 	[SerializeField] public OnMoveEndHandler onMoveEnd;
 | |
| 	
 | |
| 	[SerializeField] public OnTouchStartHandler onTouchStart;
 | |
| 	[SerializeField] public OnTouchUPHandler onTouchUp;
 | |
| 	
 | |
| 	
 | |
| 	[SerializeField] public OnDownUpHandler OnDownUp;
 | |
| 	[SerializeField] public OnDownDownHandler OnDownDown;
 | |
| 	[SerializeField] public OnDownLeftHandler OnDownLeft;
 | |
| 	[SerializeField] public OnDownRightHandler OnDownRight;
 | |
| 	
 | |
| 	[SerializeField] public OnDownUpHandler OnPressUp;
 | |
| 	[SerializeField] public OnDownDownHandler OnPressDown;
 | |
| 	[SerializeField] public OnDownLeftHandler OnPressLeft;
 | |
| 	[SerializeField] public OnDownRightHandler OnPressRight;
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Public members
 | |
| 	public ETCAxis axisX;
 | |
| 	public ETCAxis axisY;
 | |
| 	public bool isDPI;
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Private members
 | |
| 	private Image cachedImage; 
 | |
| 
 | |
| 	private Vector2 tmpAxis;
 | |
| 	private Vector2 OldTmpAxis;
 | |
| 	
 | |
| 	private GameObject previousDargObject;
 | |
| 
 | |
| 	private bool isOut;
 | |
| 	private bool isOnTouch;
 | |
| 
 | |
| 	private bool cachedVisible;
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Constructor
 | |
| 	public ETCTouchPad(){
 | |
| 
 | |
| 		axisX = new ETCAxis("Horizontal");
 | |
| 		axisX.speed = 1;
 | |
| 
 | |
| 		axisY = new ETCAxis("Vertical");
 | |
| 		axisY.speed = 1;
 | |
| 
 | |
| 		_visible = true;
 | |
| 		_activated = true;
 | |
| 
 | |
| 		showPSInspector = true; 
 | |
| 		showSpriteInspector = false;
 | |
| 		showBehaviourInspector = false;
 | |
| 		showEventInspector = false;
 | |
| 
 | |
| 		tmpAxis = Vector2.zero;
 | |
| 		isOnDrag = false;
 | |
| 		isOnTouch = false;
 | |
| 
 | |
| 		axisX.unityAxis = "Horizontal";
 | |
| 		axisY.unityAxis = "Vertical";
 | |
| 
 | |
| 		enableKeySimulation = true;
 | |
| 		#if !UNITY_EDITOR
 | |
| 		enableKeySimulation = false;
 | |
| 		#endif
 | |
| 
 | |
| 		isOut = false;
 | |
| 
 | |
| 		axisX.axisState = ETCAxis.AxisState.None;
 | |
| 
 | |
| 		useFixedUpdate = false;
 | |
| 
 | |
| 		isDPI = false;
 | |
| 	}
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Monobehaviour Callback
 | |
| 	protected override void Awake (){
 | |
| 		base.Awake ();
 | |
| 		cachedVisible = _visible;
 | |
| 		cachedImage = GetComponent<Image>();
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	public override void OnEnable (){
 | |
| 		base.OnEnable ();
 | |
| 		if (!cachedVisible){
 | |
| 			cachedImage.color = new Color(0,0,0,0);
 | |
| 		}
 | |
| 
 | |
| 		if (allowSimulationStandalone && enableKeySimulation && !Application.isEditor){
 | |
| 			SetVisible(visibleOnStandalone);
 | |
| 		}
 | |
| 	}
 | |
| 	public override void Start(){
 | |
| 		base.Start();
 | |
| 		tmpAxis = Vector2.zero;
 | |
| 		OldTmpAxis = Vector2.zero;
 | |
| 		axisX.InitAxis();
 | |
| 		axisY.InitAxis();
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	protected override void UpdateControlState ()
 | |
| 	{
 | |
| 		UpdateTouchPad();
 | |
| 	}
 | |
| 
 | |
| 	protected override void DoActionBeforeEndOfFrame (){
 | |
| 		axisX.DoGravity();
 | |
| 		axisY.DoGravity();
 | |
| 	}
 | |
| 	#endregion
 | |
| 
 | |
| 	#region UI Callback
 | |
| 	public void OnPointerEnter(PointerEventData eventData){
 | |
| 
 | |
| 		if (isSwipeIn &&  axisX.axisState == ETCAxis.AxisState.None && _activated && !isOnTouch){
 | |
| 
 | |
| 			if (eventData.pointerDrag != null && eventData.pointerDrag!= gameObject){
 | |
| 				previousDargObject=eventData.pointerDrag;
 | |
| 			}
 | |
| 			else if (eventData.pointerPress!= null && eventData.pointerPress!= gameObject){
 | |
| 				previousDargObject=eventData.pointerPress;
 | |
| 			}
 | |
| 
 | |
| 			eventData.pointerDrag = gameObject;
 | |
| 			eventData.pointerPress = gameObject;
 | |
| 			OnPointerDown( eventData);
 | |
| 
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public void OnBeginDrag(PointerEventData eventData){
 | |
| 		if (pointId == eventData.pointerId){
 | |
| 			onMoveStart.Invoke();
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	public void OnDrag(PointerEventData eventData){
 | |
| 
 | |
| 		if (activated && !isOut && pointId == eventData.pointerId){
 | |
| 			isOnTouch = true;
 | |
| 			isOnDrag = true;
 | |
| 			if (isDPI){
 | |
| 				//tmpAxis = new Vector2(eventData.delta.x / Screen.width * 1000 , eventData.delta.y / Screen.height *1000);
 | |
| 				tmpAxis = new Vector2(eventData.delta.x / Screen.dpi * 100 , eventData.delta.y / Screen.dpi *100);
 | |
| 			}
 | |
| 			else{
 | |
| 				tmpAxis = new Vector2(eventData.delta.x , eventData.delta.y );
 | |
| 			}
 | |
| 
 | |
| 			if (!axisX.enable){
 | |
| 				tmpAxis.x=0;
 | |
| 			}
 | |
| 
 | |
| 			if (!axisY.enable){
 | |
| 				tmpAxis.y=0;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	public void OnPointerDown(PointerEventData eventData){
 | |
| 
 | |
| 		if (_activated && !isOnTouch){
 | |
| 			axisX.axisState = ETCAxis.AxisState.Down;
 | |
| 			tmpAxis = eventData.delta;
 | |
| 			isOut = false;
 | |
| 			isOnTouch = true;
 | |
| 			pointId = eventData.pointerId;
 | |
| 
 | |
| 			onTouchStart.Invoke();
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	public void OnPointerUp(PointerEventData eventData){
 | |
| 
 | |
| 		if (pointId == eventData.pointerId){
 | |
| 			isOnDrag = false;
 | |
| 			isOnTouch = false;
 | |
| 			tmpAxis = Vector2.zero;
 | |
| 			OldTmpAxis = Vector2.zero;
 | |
| 			
 | |
| 			axisX.axisState = ETCAxis.AxisState.None;
 | |
| 			axisY.axisState = ETCAxis.AxisState.None;
 | |
| 			
 | |
| 			if (!axisX.isEnertia && !axisY.isEnertia){
 | |
| 				axisX.ResetAxis();
 | |
| 				axisY.ResetAxis();
 | |
| 				onMoveEnd.Invoke();
 | |
| 			}
 | |
| 			
 | |
| 			onTouchUp.Invoke();
 | |
| 			
 | |
| 			
 | |
| 			if (previousDargObject){
 | |
| 				ExecuteEvents.Execute<IPointerUpHandler> (previousDargObject, eventData, ExecuteEvents.pointerUpHandler);
 | |
| 				previousDargObject = null;
 | |
| 			}
 | |
| 			
 | |
| 			pointId = -1;
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	public void OnPointerExit(PointerEventData eventData){
 | |
| 		if (pointId == eventData.pointerId){
 | |
| 			if (!isSwipeOut){
 | |
| 				isOut = true;
 | |
| 				OnPointerUp( eventData);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Update TouchPad
 | |
| 	private void UpdateTouchPad(){
 | |
| 
 | |
| 		#region Key simulation
 | |
| 		
 | |
| 		if (enableKeySimulation && !isOnTouch && _activated && _visible){
 | |
| 			isOnDrag = false;
 | |
| 			tmpAxis = Vector2.zero;
 | |
| 
 | |
| 			float x = Input.GetAxis(axisX.unityAxis);
 | |
| 			float y= Input.GetAxis(axisY.unityAxis);
 | |
| 
 | |
| 			if (x!=0){
 | |
| 				isOnDrag = true;
 | |
| 				tmpAxis = new Vector2(1 * Mathf.Sign(x),tmpAxis.y);
 | |
| 			}
 | |
| 			
 | |
| 			if (y!=0){
 | |
| 				isOnDrag = true;
 | |
| 				tmpAxis = new Vector2(tmpAxis.x,1 * Mathf.Sign(y));
 | |
| 			}
 | |
| 		}
 | |
| 		#endregion
 | |
| 
 | |
| 		OldTmpAxis.x = axisX.axisValue;
 | |
| 		OldTmpAxis.y = axisY.axisValue;
 | |
| 		
 | |
| 		axisX.UpdateAxis( tmpAxis.x,isOnDrag,ETCBase.ControlType.DPad);
 | |
| 		axisY.UpdateAxis( tmpAxis.y,isOnDrag, ETCBase.ControlType.DPad);
 | |
| 
 | |
| 		#region Move event
 | |
| 		if (axisX.axisValue!=0 ||  axisY.axisValue!=0 ){
 | |
| 			
 | |
| 			// X axis
 | |
| 			if( axisX.actionOn == ETCAxis.ActionOn.Down && (axisX.axisState == ETCAxis.AxisState.DownLeft || axisX.axisState == ETCAxis.AxisState.DownRight)){
 | |
| 				axisX.DoDirectAction();
 | |
| 			}
 | |
| 			else if (axisX.actionOn == ETCAxis.ActionOn.Press){
 | |
| 				axisX.DoDirectAction();
 | |
| 			}
 | |
| 			
 | |
| 			// Y axis
 | |
| 			if( axisY.actionOn == ETCAxis.ActionOn.Down && (axisY.axisState == ETCAxis.AxisState.DownUp || axisY.axisState == ETCAxis.AxisState.DownDown)){
 | |
| 				axisY.DoDirectAction();
 | |
| 			}
 | |
| 			else if (axisY.actionOn == ETCAxis.ActionOn.Press){
 | |
| 				axisY.DoDirectAction();
 | |
| 			}
 | |
| 			onMove.Invoke( new Vector2(axisX.axisValue,axisY.axisValue));
 | |
| 			onMoveSpeed.Invoke( new Vector2(axisX.axisSpeedValue,axisY.axisSpeedValue));
 | |
| 		}
 | |
| 		else if (axisX.axisValue==0 &&  axisY.axisValue==0  && OldTmpAxis!=Vector2.zero) {
 | |
| 			onMoveEnd.Invoke();
 | |
| 		}
 | |
| 		#endregion
 | |
| 
 | |
| 		#region Down & press event
 | |
| 		float coef =1;
 | |
| 		if (axisX.invertedAxis) coef = -1;
 | |
| 		if (OldTmpAxis.x == 0 && Mathf.Abs(axisX.axisValue)>0){
 | |
| 			
 | |
| 			
 | |
| 			if (axisX.axisValue*coef >0){
 | |
| 				axisX.axisState = ETCAxis.AxisState.DownRight;
 | |
| 				OnDownRight.Invoke();
 | |
| 			}
 | |
| 			else if (axisX.axisValue*coef<0){
 | |
| 				axisX.axisState = ETCAxis.AxisState.DownLeft;
 | |
| 				OnDownLeft.Invoke();
 | |
| 			}
 | |
| 			else{
 | |
| 				axisX.axisState = ETCAxis.AxisState.None;
 | |
| 			}
 | |
| 		}
 | |
| 		else if (axisX.axisState!= ETCAxis.AxisState.None) {
 | |
| 			if (axisX.axisValue*coef>0){
 | |
| 				axisX.axisState = ETCAxis.AxisState.PressRight;
 | |
| 				OnPressRight.Invoke();
 | |
| 			}
 | |
| 			else if (axisX.axisValue*coef<0){
 | |
| 				axisX.axisState = ETCAxis.AxisState.PressLeft;
 | |
| 				OnPressLeft.Invoke();
 | |
| 			}
 | |
| 			else{
 | |
| 				axisX.axisState = ETCAxis.AxisState.None;
 | |
| 			}
 | |
| 		}
 | |
| 		
 | |
| 		
 | |
| 		coef =1;
 | |
| 		if (axisY.invertedAxis) coef = -1;
 | |
| 		if (OldTmpAxis.y==0 && Mathf.Abs(axisY.axisValue)>0 ){
 | |
| 			
 | |
| 			if (axisY.axisValue*coef>0){
 | |
| 				axisY.axisState = ETCAxis.AxisState.DownUp;
 | |
| 				OnDownUp.Invoke();
 | |
| 			}
 | |
| 			else if (axisY.axisValue*coef<0){
 | |
| 				axisY.axisState = ETCAxis.AxisState.DownDown;
 | |
| 				OnDownDown.Invoke();
 | |
| 			}
 | |
| 			else{
 | |
| 				axisY.axisState = ETCAxis.AxisState.None;
 | |
| 			}
 | |
| 		}
 | |
| 		else if (axisY.axisState!= ETCAxis.AxisState.None) {
 | |
| 			if (axisY.axisValue*coef>0){
 | |
| 				axisY.axisState = ETCAxis.AxisState.PressUp;
 | |
| 				OnPressUp.Invoke();
 | |
| 			}
 | |
| 			else if (axisY.axisValue*coef<0){
 | |
| 				axisY.axisState = ETCAxis.AxisState.PressDown;
 | |
| 				OnPressDown.Invoke();
 | |
| 			}
 | |
| 			else{
 | |
| 				axisY.axisState = ETCAxis.AxisState.None;
 | |
| 			}
 | |
| 		}
 | |
| 		#endregion
 | |
| 		tmpAxis = Vector2.zero;
 | |
| 	}
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Private Method
 | |
| 	protected override void SetVisible (bool forceUnvisible=false){
 | |
| 		if (Application.isPlaying){
 | |
| 			if (!_visible){
 | |
| 				cachedImage.color = new Color(0,0,0,0);
 | |
| 			}
 | |
| 			else{
 | |
| 				cachedImage.color = new Color(1,1,1,1);
 | |
| 			}
 | |
| 		}
 | |
| 	
 | |
| 	}
 | |
| 
 | |
| 	protected override void SetActivated(){
 | |
| 
 | |
| 		if (!_activated){
 | |
| 			isOnDrag = false;
 | |
| 			isOnTouch = false;
 | |
| 			tmpAxis = Vector2.zero;
 | |
| 			OldTmpAxis = Vector2.zero;
 | |
| 			
 | |
| 			axisX.axisState = ETCAxis.AxisState.None;
 | |
| 			axisY.axisState = ETCAxis.AxisState.None;
 | |
| 			
 | |
| 			if (!axisX.isEnertia && !axisY.isEnertia){
 | |
| 				axisX.ResetAxis();
 | |
| 				axisY.ResetAxis();
 | |
| 			}
 | |
| 
 | |
| 			pointId = -1;
 | |
| 		}
 | |
| 	}
 | |
| 	#endregion
 | |
| }
 |