395 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			395 lines
		
	
	
		
			9.9 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; | |||
|  | 
 | |||
|  | public class ETCDPad : ETCBase, IDragHandler,  IPointerDownHandler, IPointerUpHandler {  | |||
|  | 
 | |||
|  | 	#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 Members | |||
|  | 	#region Public members | |||
|  | 	public ETCAxis axisX; | |||
|  | 	public ETCAxis axisY; | |||
|  | 	 | |||
|  | 	public Sprite normalSprite; | |||
|  | 	public Color normalColor; | |||
|  | 
 | |||
|  | 	public Sprite pressedSprite; | |||
|  | 	public Color pressedColor; | |||
|  | 	 | |||
|  | 	#endregion | |||
|  | 
 | |||
|  | 	#region Private Member | |||
|  | 	private Vector2 tmpAxis; | |||
|  | 	private Vector2 OldTmpAxis; | |||
|  | 	private bool isOnTouch; | |||
|  | 	#endregion | |||
|  | 
 | |||
|  | 	#endregion | |||
|  | 	 | |||
|  | 	#region Private members | |||
|  | 	private Image cachedImage;  | |||
|  | 	#endregion | |||
|  | 
 | |||
|  | 	#region Constructor | |||
|  | 	public ETCDPad(){ | |||
|  | 		 | |||
|  | 		axisX = new ETCAxis( "Horizontal"); | |||
|  | 		axisY = new ETCAxis( "Vertical"); | |||
|  | 
 | |||
|  | 		_visible = true; | |||
|  | 		_activated = true; | |||
|  | 
 | |||
|  | 		dPadAxisCount = DPadAxis.Two_Axis; | |||
|  | 		tmpAxis = Vector2.zero; | |||
|  | 
 | |||
|  | 		showPSInspector = true;  | |||
|  | 		showSpriteInspector = false; | |||
|  | 		showBehaviourInspector = false; | |||
|  | 		showEventInspector = false; | |||
|  | 
 | |||
|  | 		isOnDrag = false; | |||
|  | 		isOnTouch = false; | |||
|  | 
 | |||
|  | 		axisX.unityAxis = "Horizontal"; | |||
|  | 		axisY.unityAxis = "Vertical"; | |||
|  | 		 | |||
|  | 		enableKeySimulation = true; | |||
|  | 	} | |||
|  | 	#endregion | |||
|  | 
 | |||
|  | 	#region Monobehaviour Callback | |||
|  | 	public override void Start(){ | |||
|  | 
 | |||
|  | 		base.Start(); | |||
|  | 
 | |||
|  | 		tmpAxis = Vector2.zero; | |||
|  | 		OldTmpAxis = Vector2.zero; | |||
|  | 		 | |||
|  | 		axisX.InitAxis(); | |||
|  | 		axisY.InitAxis(); | |||
|  | 
 | |||
|  | 		if (allowSimulationStandalone && enableKeySimulation && !Application.isEditor){ | |||
|  | 			SetVisible(visibleOnStandalone); | |||
|  | 		} | |||
|  | 	} | |||
|  | 
 | |||
|  | 	/* | |||
|  | 	void Update(){ | |||
|  | 		 | |||
|  | 		if (!useFixedUpdate){ | |||
|  | 			UpdateDPad(); | |||
|  | 		} | |||
|  | 	} | |||
|  | 	 | |||
|  | 	void FixedUpdate(){ | |||
|  | 		if (useFixedUpdate){ | |||
|  | 			UpdateDPad(); | |||
|  | 		} | |||
|  | 	}*/ | |||
|  | 
 | |||
|  | 	protected override void UpdateControlState () | |||
|  | 	{ | |||
|  | 		UpdateDPad(); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	protected override void DoActionBeforeEndOfFrame (){ | |||
|  | 		axisX.DoGravity(); | |||
|  | 		axisY.DoGravity(); | |||
|  | 	} | |||
|  | 	#endregion | |||
|  | 
 | |||
|  | 	#region UI Callback | |||
|  | 	public void OnPointerDown(PointerEventData eventData){ | |||
|  | 		if (_activated && !isOnTouch){ | |||
|  | 			onTouchStart.Invoke(); | |||
|  | 			GetTouchDirection( eventData.position,eventData.pressEventCamera); | |||
|  | 			isOnTouch = true; | |||
|  | 			isOnDrag = true; | |||
|  | 			pointId = eventData.pointerId; | |||
|  | 		} | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public void OnDrag(PointerEventData eventData){ | |||
|  | 		if (_activated && pointId == eventData.pointerId){ | |||
|  | 			isOnTouch = true; | |||
|  | 			isOnDrag = true; | |||
|  | 			GetTouchDirection( eventData.position,eventData.pressEventCamera); | |||
|  | 		} | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public void OnPointerUp(PointerEventData eventData){ | |||
|  | 
 | |||
|  | 		if (pointId == eventData.pointerId){ | |||
|  | 			isOnTouch = false; | |||
|  | 			isOnDrag = 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(); | |||
|  | 			} | |||
|  | 
 | |||
|  | 			pointId = -1; | |||
|  | 
 | |||
|  | 			onTouchUp.Invoke(); | |||
|  | 		} | |||
|  | 	} | |||
|  | 
 | |||
|  | 	#endregion | |||
|  | 
 | |||
|  | 	#region DPad Update | |||
|  | 	void UpdateDPad(){ | |||
|  | 
 | |||
|  | 		#region Key simulation | |||
|  | 
 | |||
|  | 		if (enableKeySimulation && !isOnTouch && _activated && _visible){ | |||
|  | 			float x = Input.GetAxis(axisX.unityAxis); | |||
|  | 			float y= Input.GetAxis(axisY.unityAxis); | |||
|  | 
 | |||
|  | 			isOnDrag = false; | |||
|  | 			tmpAxis = Vector2.zero; | |||
|  | 
 | |||
|  | 			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 ) && OldTmpAxis == Vector2.zero){ | |||
|  | 			onMoveStart.Invoke(); | |||
|  | 		} | |||
|  | 
 | |||
|  | 		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 | |||
|  | 
 | |||
|  | 	} | |||
|  | 
 | |||
|  | 	#endregion | |||
|  | 
 | |||
|  | 	#region Private methods | |||
|  | 	protected override void SetVisible (bool forceUnvisible=false){ | |||
|  | 		bool localVisible = _visible; | |||
|  | 		if (!visible){ | |||
|  | 			localVisible = visible; | |||
|  | 		} | |||
|  | 		GetComponent<Image>().enabled = localVisible; | |||
|  | 	} | |||
|  | 
 | |||
|  | 	protected override void SetActivated (){ | |||
|  | 
 | |||
|  | 		if (!_activated){ | |||
|  | 			isOnTouch = false; | |||
|  | 			isOnDrag = 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; | |||
|  | 		} | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public float buttonSizeCoef = 3; | |||
|  | 
 | |||
|  | 	private void GetTouchDirection(Vector2 position, Camera cam){ | |||
|  | 
 | |||
|  | 		Vector2 localPoint; | |||
|  | 		RectTransformUtility.ScreenPointToLocalPointInRectangle( cachedRectTransform,position,cam,out localPoint); | |||
|  | 		 | |||
|  | 		Vector2 buttonSize = this.rectTransform().sizeDelta / buttonSizeCoef; | |||
|  | 		 | |||
|  | 		 | |||
|  | 		tmpAxis = Vector2.zero; | |||
|  | 		 | |||
|  | 		 | |||
|  | 		// Left | |||
|  | 		if ( (localPoint.x < -buttonSize.x/2 && localPoint.y > -buttonSize.y/2 && localPoint.y< buttonSize.y/2 && dPadAxisCount== DPadAxis.Two_Axis)  | |||
|  | 		    || (dPadAxisCount== DPadAxis.Four_Axis &&  localPoint.x < -buttonSize.x/2) ){ | |||
|  | 			tmpAxis.x = -1; | |||
|  | 		} | |||
|  | 		 | |||
|  | 		// right | |||
|  | 		if ( (localPoint.x > buttonSize.x/2 && localPoint.y> -buttonSize.y/2 && localPoint.y< buttonSize.y/2 && dPadAxisCount== DPadAxis.Two_Axis)  | |||
|  | 		    || (dPadAxisCount== DPadAxis.Four_Axis &&  localPoint.x > buttonSize.x/2) ){ | |||
|  | 			tmpAxis.x = 1; | |||
|  | 		} | |||
|  | 		 | |||
|  | 		 | |||
|  | 		// Up | |||
|  | 		if ( (localPoint.y > buttonSize.y/2f && localPoint.x>-buttonSize.x/2f && localPoint.x<buttonSize.x/2f && dPadAxisCount == DPadAxis.Two_Axis) | |||
|  | 		    || (dPadAxisCount== DPadAxis.Four_Axis &&  localPoint.y > buttonSize.y/2f) ){ | |||
|  | 			tmpAxis.y = 1; | |||
|  | 		} | |||
|  | 		 | |||
|  | 		 | |||
|  | 		// Down | |||
|  | 		if ( (localPoint.y < -buttonSize.y/2f && localPoint.x>-buttonSize.x/2f && localPoint.x<buttonSize.x/2f && dPadAxisCount == DPadAxis.Two_Axis) | |||
|  | 		    || (dPadAxisCount== DPadAxis.Four_Axis &&  localPoint.y <- buttonSize.y/2f) ){ | |||
|  | 			tmpAxis.y = -1; | |||
|  | 		} | |||
|  | 						 | |||
|  | 	} | |||
|  | 	#endregion | |||
|  | } |