240 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			240 lines
		
	
	
		
			5.3 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 ETCButton : ETCBase, IPointerEnterHandler, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler { 
 | |
| 
 | |
| 	#region Unity Events
 | |
| 	[System.Serializable] public class OnDownHandler : UnityEvent{}
 | |
| 	[System.Serializable] public class OnPressedHandler : UnityEvent{}
 | |
| 	[System.Serializable] public class OnPressedValueandler : UnityEvent<float>{}
 | |
| 	[System.Serializable] public class OnUPHandler : UnityEvent{}
 | |
| 
 | |
| 	[SerializeField] public OnDownHandler onDown;
 | |
| 	[SerializeField] public OnPressedHandler onPressed;
 | |
| 	[SerializeField] public OnPressedValueandler onPressedValue;
 | |
| 	[SerializeField] public OnUPHandler onUp;
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Members
 | |
| 
 | |
| 	#region Public members
 | |
| 	public ETCAxis axis;
 | |
| 
 | |
| 	public Sprite normalSprite;
 | |
| 	public Color normalColor;
 | |
| 
 | |
| 	public Sprite pressedSprite;
 | |
| 	public Color pressedColor;	
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Private members
 | |
| 	private Image cachedImage; 
 | |
| 	private bool isOnPress;
 | |
| 	private GameObject previousDargObject;
 | |
| 	private bool isOnTouch;
 | |
| 	#endregion
 | |
| 
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Constructor
 | |
| 	public ETCButton(){
 | |
| 
 | |
| 		axis = new ETCAxis( "Button");
 | |
| 		_visible = true;
 | |
| 		_activated = true;
 | |
| 		isOnTouch = false;
 | |
| 
 | |
| 		enableKeySimulation = true;
 | |
| 
 | |
| 		axis.unityAxis = "Jump";
 | |
| 		showPSInspector = true; 
 | |
| 		showSpriteInspector = false;
 | |
| 		showBehaviourInspector = false;
 | |
| 		showEventInspector = false;
 | |
| 	}
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Monobehaviour Callback
 | |
| 	protected override void Awake (){
 | |
| 		base.Awake ();
 | |
| 
 | |
| 		cachedImage = GetComponent<UnityEngine.UI.Image>();
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	public override void Start(){
 | |
| 		axis.InitAxis();
 | |
| 		base.Start();
 | |
| 		isOnPress = false;
 | |
| 
 | |
| 		if (allowSimulationStandalone && enableKeySimulation && !Application.isEditor){
 | |
| 			SetVisible(visibleOnStandalone);
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	protected override void UpdateControlState (){
 | |
| 		UpdateButton();
 | |
| 	}
 | |
| 
 | |
| 	protected override void DoActionBeforeEndOfFrame (){
 | |
| 		axis.DoGravity();
 | |
| 	}
 | |
| 	#endregion
 | |
| 
 | |
| 	#region UI Callback
 | |
| 	public void OnPointerEnter(PointerEventData eventData){
 | |
| 
 | |
| 		if (isSwipeIn && !isOnTouch){
 | |
| 
 | |
| 			if (eventData.pointerDrag != null){
 | |
| 				if (eventData.pointerDrag.GetComponent<ETCBase>() && eventData.pointerDrag!= gameObject){
 | |
| 					previousDargObject=eventData.pointerDrag;
 | |
| 					//ExecuteEvents.Execute<IPointerUpHandler> (previousDargObject, eventData, ExecuteEvents.pointerUpHandler);
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			eventData.pointerDrag = gameObject;
 | |
| 			eventData.pointerPress = gameObject;
 | |
| 			OnPointerDown( eventData);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public void OnPointerDown(PointerEventData eventData){
 | |
| 
 | |
| 		if (_activated && !isOnTouch){
 | |
| 			pointId = eventData.pointerId;
 | |
| 
 | |
| 			axis.ResetAxis();
 | |
| 			axis.axisState = ETCAxis.AxisState.Down;
 | |
| 
 | |
| 			isOnPress = false;
 | |
| 			isOnTouch = true;
 | |
| 
 | |
| 			onDown.Invoke();
 | |
| 			ApllyState();
 | |
| 			axis.UpdateButton();
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public void OnPointerUp(PointerEventData eventData){
 | |
| 		if (pointId == eventData.pointerId){
 | |
| 			isOnPress = false;
 | |
| 			isOnTouch = false;
 | |
| 			axis.axisState = ETCAxis.AxisState.Up;
 | |
| 			axis.axisValue = 0;
 | |
| 			onUp.Invoke();
 | |
| 			ApllyState();
 | |
| 
 | |
| 			if (previousDargObject){
 | |
| 				ExecuteEvents.Execute<IPointerUpHandler> (previousDargObject, eventData, ExecuteEvents.pointerUpHandler);
 | |
| 				previousDargObject = null;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public void OnPointerExit(PointerEventData eventData){
 | |
| 		if (pointId == eventData.pointerId){
 | |
| 			if (axis.axisState == ETCAxis.AxisState.Press && !isSwipeOut){
 | |
| 				OnPointerUp(eventData);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Button Update
 | |
| 	private void UpdateButton(){
 | |
| 
 | |
| 		if (axis.axisState == ETCAxis.AxisState.Down){
 | |
| 
 | |
| 			isOnPress = true;
 | |
| 			axis.axisState = ETCAxis.AxisState.Press;
 | |
| 		}
 | |
| 
 | |
| 		if (isOnPress){
 | |
| 			axis.UpdateButton();
 | |
| 			onPressed.Invoke();
 | |
| 			onPressedValue.Invoke( axis.axisValue);
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 		if (axis.axisState == ETCAxis.AxisState.Up){
 | |
| 			isOnPress = false;
 | |
| 			axis.axisState = ETCAxis.AxisState.None;
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		if (enableKeySimulation && _activated && _visible && !isOnTouch){
 | |
| 
 | |
| 			if (Input.GetButton( axis.unityAxis)&& axis.axisState ==ETCAxis.AxisState.None ){	
 | |
| 				axis.ResetAxis();
 | |
| 				onDown.Invoke();
 | |
| 				axis.axisState = ETCAxis.AxisState.Down;
 | |
| 			}
 | |
| 
 | |
| 			if (!Input.GetButton(axis.unityAxis )&& axis.axisState == ETCAxis.AxisState.Press){
 | |
| 				axis.axisState = ETCAxis.AxisState.Up;
 | |
| 				axis.axisValue = 0;
 | |
| 				
 | |
| 				onUp.Invoke();
 | |
| 			}
 | |
| 
 | |
| 			axis.UpdateButton();
 | |
| 			ApllyState();
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 	}	
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Private Method
 | |
| 	protected override void SetVisible (bool forceUnvisible=false){
 | |
| 		bool localVisible = _visible;
 | |
| 		if (!visible){
 | |
| 			localVisible = visible;
 | |
| 		}
 | |
| 		GetComponent<Image>().enabled = localVisible;
 | |
| 	}
 | |
| 
 | |
| 	private void ApllyState(){
 | |
| 
 | |
| 		if (cachedImage){
 | |
| 			switch (axis.axisState){
 | |
| 			case ETCAxis.AxisState.Down:
 | |
| 			case ETCAxis.AxisState.Press:
 | |
| 					cachedImage.sprite = pressedSprite;
 | |
| 					cachedImage.color = pressedColor;
 | |
| 					break;
 | |
| 				default:
 | |
| 					cachedImage.sprite = normalSprite;
 | |
| 					cachedImage.color = normalColor;
 | |
| 					break;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	protected override void SetActivated(){
 | |
| 
 | |
| 		if (!_activated){
 | |
| 			isOnPress = false;
 | |
| 			isOnTouch = false;
 | |
| 			axis.axisState = ETCAxis.AxisState.None;
 | |
| 			axis.axisValue = 0;
 | |
| 			ApllyState();
 | |
| 		}
 | |
| 	}
 | |
| 	#endregion
 | |
| }
 |