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
 | 
						|
}
 |