415 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			415 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;
 | |
| using System.Collections.Generic;
 | |
| 
 | |
| [System.Serializable]
 | |
| public abstract class ETCBase : MonoBehaviour {
 | |
| 
 | |
| 	#region Enumeration
 | |
| 	public enum ControlType {Joystick, TouchPad, DPad, Button};
 | |
| 	public enum RectAnchor { UserDefined,BottomLeft,BottomCenter,BottonRight,CenterLeft,Center,CenterRight,TopLeft,TopCenter, TopRight};
 | |
| 	public enum DPadAxis{ Two_Axis, Four_Axis };
 | |
| 	public enum CameraMode{ Follow, SmoothFollow};
 | |
| 	public enum CameraTargetMode{ UserDefined, LinkOnTag,FromDirectActionAxisX, FromDirectActionAxisY};
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Members
 | |
| 	protected RectTransform cachedRectTransform;	
 | |
| 	protected Canvas cachedRootCanvas;
 | |
| 
 | |
| 	#region general propertie
 | |
| 	public bool isUnregisterAtDisable = false;
 | |
| 	private bool visibleAtStart = true;
 | |
| 	private bool activatedAtStart = true;
 | |
| 
 | |
| 	[SerializeField]
 | |
| 	protected RectAnchor _anchor;
 | |
| 	public RectAnchor anchor {
 | |
| 		get {
 | |
| 			return _anchor;
 | |
| 		}
 | |
| 		set {
 | |
| 			if (value != _anchor){
 | |
| 				_anchor = value;
 | |
| 				SetAnchorPosition();
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	[SerializeField]
 | |
| 	protected Vector2 _anchorOffet;
 | |
| 	public Vector2 anchorOffet {
 | |
| 		get {
 | |
| 			return _anchorOffet;
 | |
| 		}
 | |
| 		set {
 | |
| 			if (value != _anchorOffet){
 | |
| 				_anchorOffet = value;
 | |
| 				SetAnchorPosition();
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	[SerializeField]
 | |
| 	protected bool _visible;
 | |
| 	public bool visible {
 | |
| 		get {
 | |
| 			return _visible;
 | |
| 		}
 | |
| 		set {
 | |
| 			if (value != _visible){
 | |
| 				_visible = value;
 | |
| 				SetVisible();
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	[SerializeField]
 | |
| 	protected bool _activated;
 | |
| 	public bool activated {
 | |
| 		get {
 | |
| 			return _activated;
 | |
| 		}
 | |
| 		set {
 | |
| 			if (value != _activated){
 | |
| 				_activated = value;
 | |
| 				SetActivated();
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Camera
 | |
| 	public bool enableCamera=false;
 | |
| 	public CameraMode cameraMode;
 | |
| 	public string camTargetTag ="Player";
 | |
| 
 | |
| 	public bool autoLinkTagCam = true;
 | |
| 	public string autoCamTag ="MainCamera";
 | |
| 	public Transform cameraTransform;
 | |
| 
 | |
| 	public CameraTargetMode cameraTargetMode;
 | |
| 	public bool enableWallDetection =false;
 | |
| 	public LayerMask wallLayer = 0;
 | |
| 	public Transform cameraLookAt;
 | |
| 	protected CharacterController cameraLookAtCC;
 | |
| 
 | |
| 	public Vector3 followOffset = new Vector3(0,6,-6);
 | |
| 	public float followDistance = 10;
 | |
| 	public float followHeight = 5;
 | |
| 	public float followRotationDamping=5;
 | |
| 	public float followHeightDamping=5;	
 | |
| 	
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Other
 | |
| 	public int pointId=-1;
 | |
| 	
 | |
| 	public bool enableKeySimulation;
 | |
| 	public bool allowSimulationStandalone;
 | |
| 	public bool visibleOnStandalone = true;
 | |
| 
 | |
| 	public DPadAxis dPadAxisCount;
 | |
| 	public bool useFixedUpdate;
 | |
| 	
 | |
| 	private List<RaycastResult> uiRaycastResultCache= new List<RaycastResult>();
 | |
| 	private PointerEventData uiPointerEventData;
 | |
| 	private EventSystem uiEventSystem;
 | |
| 
 | |
| 	public bool isOnDrag;
 | |
| 	public bool isSwipeIn;
 | |
| 	public bool isSwipeOut;
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Inspector
 | |
| 	public bool showPSInspector;
 | |
| 	public bool showSpriteInspector;
 | |
| 	public bool showEventInspector;
 | |
| 	public bool showBehaviourInspector;
 | |
| 	public bool showAxesInspector;
 | |
| 	public bool showTouchEventInspector;
 | |
| 	public bool showDownEventInspector;
 | |
| 	public bool showPressEventInspector;
 | |
| 	public bool showCameraInspector;
 | |
| 	#endregion
 | |
| 
 | |
| 
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Monobehaviour callback
 | |
| 	protected virtual void Awake(){
 | |
| 		cachedRectTransform = transform as RectTransform;
 | |
| 		cachedRootCanvas = transform.parent.GetComponent<Canvas>();
 | |
| 
 | |
| 		#if (!UNITY_EDITOR) 
 | |
| 		if (!allowSimulationStandalone){
 | |
| 			enableKeySimulation = false;
 | |
| 		}
 | |
| 		#endif
 | |
| 
 | |
| 		visibleAtStart = _visible;
 | |
| 		activatedAtStart = _activated;
 | |
| 
 | |
| 		if (!isUnregisterAtDisable){
 | |
| 			ETCInput.instance.RegisterControl( this);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public virtual void Start(){
 | |
| 
 | |
| 		if (enableCamera){
 | |
| 			if (autoLinkTagCam){
 | |
| 				cameraTransform = null;
 | |
| 				GameObject tmpobj = GameObject.FindGameObjectWithTag(autoCamTag);
 | |
| 				if (tmpobj){
 | |
| 					cameraTransform = tmpobj.transform;
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	public virtual void OnEnable(){
 | |
| 
 | |
| 		if (isUnregisterAtDisable){
 | |
| 			ETCInput.instance.RegisterControl( this);
 | |
| 		}
 | |
| 
 | |
| 		visible = visibleAtStart;
 | |
| 		activated = activatedAtStart;
 | |
| 	}
 | |
| 	
 | |
| 	void OnDisable(){
 | |
| 
 | |
| 		if (ETCInput._instance ){
 | |
| 			if (isUnregisterAtDisable){
 | |
| 				ETCInput.instance.UnRegisterControl( this );
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		visibleAtStart = _visible;
 | |
| 		activated = _activated;
 | |
| 
 | |
| 		visible = false;
 | |
| 		activated = false;
 | |
| 	}
 | |
| 	
 | |
| 	void OnDestroy(){
 | |
| 
 | |
| 		if (ETCInput._instance){
 | |
| 			ETCInput.instance.UnRegisterControl( this );
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	public virtual void Update(){
 | |
| 
 | |
| 		if (!useFixedUpdate){
 | |
| 			StartCoroutine ("UpdateVirtualControl");
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	public virtual void FixedUpdate(){
 | |
| 		if (useFixedUpdate){
 | |
| 			StartCoroutine ("FixedUpdateVirtualControl");
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public virtual void LateUpdate(){
 | |
| 		if (enableCamera){
 | |
| 
 | |
| 			// find camera 
 | |
| 			if (autoLinkTagCam && cameraTransform==null){
 | |
| 				//cameraTransform = null;
 | |
| 				GameObject tmpobj = GameObject.FindGameObjectWithTag(autoCamTag);
 | |
| 				if (tmpobj){
 | |
| 					cameraTransform = tmpobj.transform;
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			switch (cameraMode){
 | |
| 			case CameraMode.Follow:
 | |
| 				CameraFollow();
 | |
| 				break;
 | |
| 			case CameraMode.SmoothFollow:
 | |
| 				CameraSmoothFollow();
 | |
| 				break;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Virtual & public
 | |
| 	protected virtual void UpdateControlState(){
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	protected virtual void SetVisible(bool forceUnvisible=true){
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	protected virtual void SetActivated(){
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	public void SetAnchorPosition(){
 | |
| 		
 | |
| 		switch (_anchor){
 | |
| 		case RectAnchor.TopLeft:
 | |
| 			this.rectTransform().anchorMin = new Vector2(0,1);
 | |
| 			this.rectTransform().anchorMax = new Vector2(0,1);
 | |
| 			this.rectTransform().anchoredPosition = new Vector2( this.rectTransform().sizeDelta.x/2f + _anchorOffet.x, -this.rectTransform().sizeDelta.y/2f - _anchorOffet.y);
 | |
| 			break;
 | |
| 		case RectAnchor.TopCenter:
 | |
| 			this.rectTransform().anchorMin = new Vector2(0.5f,1);
 | |
| 			this.rectTransform().anchorMax = new Vector2(0.5f,1);
 | |
| 			this.rectTransform().anchoredPosition = new Vector2(  _anchorOffet.x, -this.rectTransform().sizeDelta.y/2f - _anchorOffet.y);
 | |
| 			break;
 | |
| 		case RectAnchor.TopRight:
 | |
| 			this.rectTransform().anchorMin = new Vector2(1,1);
 | |
| 			this.rectTransform().anchorMax = new Vector2(1,1);
 | |
| 			this.rectTransform().anchoredPosition = new Vector2( -this.rectTransform().sizeDelta.x/2f - _anchorOffet.x, -this.rectTransform().sizeDelta.y/2f - _anchorOffet.y);
 | |
| 			break;
 | |
| 			
 | |
| 		case RectAnchor.CenterLeft:
 | |
| 			this.rectTransform().anchorMin = new Vector2(0,0.5f);
 | |
| 			this.rectTransform().anchorMax = new Vector2(0,0.5f);
 | |
| 			this.rectTransform().anchoredPosition = new Vector2( this.rectTransform().sizeDelta.x/2f + _anchorOffet.x, _anchorOffet.y);
 | |
| 			break;
 | |
| 			
 | |
| 		case RectAnchor.Center:
 | |
| 			this.rectTransform().anchorMin = new Vector2(0.5f,0.5f);
 | |
| 			this.rectTransform().anchorMax = new Vector2(0.5f,0.5f);
 | |
| 			this.rectTransform().anchoredPosition = new Vector2(  _anchorOffet.x, _anchorOffet.y);
 | |
| 			break;
 | |
| 			
 | |
| 		case RectAnchor.CenterRight:
 | |
| 			this.rectTransform().anchorMin = new Vector2(1,0.5f);
 | |
| 			this.rectTransform().anchorMax = new Vector2(1,0.5f);
 | |
| 			this.rectTransform().anchoredPosition = new Vector2( -this.rectTransform().sizeDelta.x/2f -  _anchorOffet.x, _anchorOffet.y);
 | |
| 			break; 
 | |
| 			
 | |
| 		case RectAnchor.BottomLeft:
 | |
| 			this.rectTransform().anchorMin = new Vector2(0,0);
 | |
| 			this.rectTransform().anchorMax = new Vector2(0,0);
 | |
| 			this.rectTransform().anchoredPosition = new Vector2( this.rectTransform().sizeDelta.x/2f + _anchorOffet.x, this.rectTransform().sizeDelta.y/2f + _anchorOffet.y);
 | |
| 			break;
 | |
| 		case RectAnchor.BottomCenter:
 | |
| 			this.rectTransform().anchorMin = new Vector2(0.5f,0);
 | |
| 			this.rectTransform().anchorMax = new Vector2(0.5f,0);
 | |
| 			this.rectTransform().anchoredPosition = new Vector2(  _anchorOffet.x, this.rectTransform().sizeDelta.y/2f + _anchorOffet.y);
 | |
| 			break;
 | |
| 		case RectAnchor.BottonRight:
 | |
| 			this.rectTransform().anchorMin = new Vector2(1,0);
 | |
| 			this.rectTransform().anchorMax = new Vector2(1,0);
 | |
| 			this.rectTransform().anchoredPosition = new Vector2( -this.rectTransform().sizeDelta.x/2f - _anchorOffet.x, this.rectTransform().sizeDelta.y/2f + _anchorOffet.y);
 | |
| 			break;
 | |
| 		}
 | |
| 		
 | |
| 	}
 | |
| 
 | |
| 	protected GameObject GetFirstUIElement( Vector2 position){
 | |
| 		
 | |
| 		uiEventSystem = EventSystem.current;
 | |
| 		if (uiEventSystem != null){
 | |
| 			
 | |
| 			uiPointerEventData = new PointerEventData( uiEventSystem);
 | |
| 			uiPointerEventData.position = position;
 | |
| 			
 | |
| 			uiEventSystem.RaycastAll( uiPointerEventData, uiRaycastResultCache);
 | |
| 			if (uiRaycastResultCache.Count>0){
 | |
| 				return uiRaycastResultCache[0].gameObject;
 | |
| 			}
 | |
| 			else{
 | |
| 				return null;
 | |
| 			}
 | |
| 		}
 | |
| 		else{
 | |
| 			return null;
 | |
| 		}
 | |
| 	}
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Private Method
 | |
| 	protected void CameraSmoothFollow(){
 | |
| 
 | |
| 		if (!cameraTransform  ||  !cameraLookAt ) return ;
 | |
| 
 | |
| 
 | |
| 		float wantedRotationAngle = cameraLookAt.eulerAngles.y;
 | |
| 		float wantedHeight = cameraLookAt.position.y + followHeight;
 | |
| 		
 | |
| 		float currentRotationAngle = cameraTransform.eulerAngles.y;
 | |
| 		float currentHeight = cameraTransform.position.y;
 | |
| 
 | |
| 		currentRotationAngle = Mathf.LerpAngle(currentRotationAngle, wantedRotationAngle, followRotationDamping * Time.deltaTime);
 | |
| 		currentHeight = Mathf.Lerp(currentHeight, wantedHeight, followHeightDamping * Time.deltaTime);
 | |
| 
 | |
| 		Quaternion currentRotation = Quaternion.Euler(0, currentRotationAngle, 0);
 | |
| 
 | |
| 		Vector3 newPos = cameraLookAt.position;
 | |
| 		newPos -= currentRotation * Vector3.forward * followDistance;
 | |
| 		newPos = new Vector3(newPos.x ,currentHeight , newPos.z);
 | |
| 
 | |
| 		if (enableWallDetection){
 | |
| 			RaycastHit wallHit;
 | |
| 
 | |
| 			if (Physics.Linecast( new Vector3(cameraLookAt.position.x,cameraLookAt.position.y+1f,cameraLookAt.position.z),newPos, out wallHit)){
 | |
| 				newPos= new Vector3( wallHit.point.x, currentHeight,wallHit.point.z);
 | |
| 			}
 | |
| 		}
 | |
| 		cameraTransform.position = newPos;
 | |
| 		cameraTransform.LookAt(cameraLookAt);
 | |
| 		
 | |
| 	}
 | |
| 	
 | |
| 
 | |
| 	protected void CameraFollow(){
 | |
| 
 | |
| 		if (!cameraTransform  ||  !cameraLookAt ) return ;
 | |
| 
 | |
| 		Vector3 localOffset = followOffset;
 | |
| 
 | |
| 		//if (cameraLookAtCC){
 | |
| 			cameraTransform.position = cameraLookAt.position + localOffset;
 | |
| 			cameraTransform.LookAt( cameraLookAt.position);
 | |
| 		//}
 | |
| 		//else{
 | |
| 
 | |
| 		//}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	IEnumerator UpdateVirtualControl() {
 | |
| 
 | |
| 		DoActionBeforeEndOfFrame();
 | |
| 
 | |
| 		yield return new WaitForEndOfFrame();
 | |
| 		
 | |
| 		UpdateControlState();
 | |
| 	}
 | |
| 
 | |
| 	IEnumerator FixedUpdateVirtualControl() {
 | |
| 		
 | |
| 		DoActionBeforeEndOfFrame();
 | |
| 		
 | |
| 		yield return new WaitForFixedUpdate();
 | |
| 		
 | |
| 		UpdateControlState();
 | |
| 	}
 | |
| 
 | |
| 	protected virtual void DoActionBeforeEndOfFrame(){
 | |
| 	}
 | |
| 	#endregion
 | |
| }
 |