diff options
author | Jakob Stendahl <jakst070500@ntvgs.no> | 2017-09-29 12:42:11 +0200 |
---|---|---|
committer | Jakob Stendahl <jakst070500@ntvgs.no> | 2017-09-29 12:42:11 +0200 |
commit | 76cf99ade6530bdad81088295fb4cf73f5c5b118 (patch) | |
tree | e3cf549687d164c11d6b292d771534e98bcc97a8 /td/Assets/Scripts/PinchZoom.cs | |
parent | 608b6a0e692a580f0dfabef0b2ef1a59f0a37234 (diff) | |
parent | 9a00d03f80eee94c9fe52f832a0127d9375ad375 (diff) | |
download | TD-76cf99ade6530bdad81088295fb4cf73f5c5b118.tar.gz TD-76cf99ade6530bdad81088295fb4cf73f5c5b118.zip |
Merge branch 'master' of https://github.com/JakobS1n/unityTest
Diffstat (limited to 'td/Assets/Scripts/PinchZoom.cs')
-rw-r--r-- | td/Assets/Scripts/PinchZoom.cs | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/td/Assets/Scripts/PinchZoom.cs b/td/Assets/Scripts/PinchZoom.cs new file mode 100644 index 0000000..b3e6d22 --- /dev/null +++ b/td/Assets/Scripts/PinchZoom.cs @@ -0,0 +1,144 @@ +using UnityEngine; +using System.Collections; + +public class PinchZoom : MonoBehaviour +{ + /* Dette vil bare funke for et ortografisk kamera! */ + + private static readonly float PanSpeed = 20f; + private static readonly float ZoomSpeedTouch = 0.1f; + private static readonly float ZoomSpeedMouse = .5f; + + public static readonly float[] BoundsX = new float[]{-10f, 5f}; + public static readonly float[] BoundsZ = new float[]{-18f, -4f}; + public static readonly float[] ZoomBounds = new float[]{10f, 85f}; + + private Camera cam; + + private bool panActive; + private Vector3 lastPanPosition; + private int panFingerId; // Touch mode only + + private bool zoomActive; + private Vector2[] lastZoomPositions; // Touch mode only + + void Awake() { + cam = GetComponent<Camera>(); + + #if UNITY_ANDROID || UNITY_IOS + cam.fieldOfView = 60f; + #endif + } + + void Update() { + // If there's an open menu, or the clicker is being pressed, ignore the touch. + /* + if (GameManager.Instance.MenuManager.HasOpenMenu || GameManager.Instance.BitSpawnManager.IsSpawningBits) { + return; + }*/ + + if (Input.touchSupported && Application.platform != RuntimePlatform.WebGLPlayer) { + HandleTouch(); + } else { + HandleMouse(); + } + } + + void HandleTouch() { + switch(Input.touchCount) { + + case 1: // Panning + zoomActive = false; + + // If the touch began, capture its position and its finger ID. + // Otherwise, if the finger ID of the touch doesn't match, skip it. + Touch touch = Input.GetTouch(0); + if (touch.phase == TouchPhase.Began) { + lastPanPosition = touch.position; + panFingerId = touch.fingerId; + panActive = true; + } else if (touch.fingerId == panFingerId && touch.phase == TouchPhase.Moved) { + PanCamera(touch.position); + } + break; + + case 2: // Zooming + panActive = false; + + Vector2[] newPositions = new Vector2[]{Input.GetTouch(0).position, Input.GetTouch(1).position}; + if (!zoomActive) { + lastZoomPositions = newPositions; + zoomActive = true; + } else { + // Zoom based on the distance between the new positions compared to the + // distance between the previous positions. + float newDistance = Vector2.Distance(newPositions[0], newPositions[1]); + float oldDistance = Vector2.Distance(lastZoomPositions[0], lastZoomPositions[1]); + float offset = newDistance - oldDistance; + + ZoomCamera(offset, ZoomSpeedTouch); + + lastZoomPositions = newPositions; + } + break; + + default: + panActive = false; + zoomActive = false; + break; + } + } + + void HandleMouse() { + // On mouse down, capture it's position. + // On mouse up, disable panning. + // If there is no mouse being pressed, do nothing. + if (Input.GetMouseButtonDown(0)) { + panActive = true; + lastPanPosition = Input.mousePosition; + } else if (Input.GetMouseButtonUp(0)) { + panActive = false; + } else if (Input.GetMouseButton(0)) { + PanCamera(Input.mousePosition); + } + + // Check for scrolling to zoom the camera + float scroll = Input.GetAxis("Mouse ScrollWheel"); + zoomActive = true; + ZoomCamera(scroll, ZoomSpeedMouse); + zoomActive = false; + } + + void PanCamera(Vector3 newPanPosition) { + if (!panActive) { + return; + } + + // Translate the camera position based on the new input position + Vector3 offset = cam.ScreenToViewportPoint(lastPanPosition - newPanPosition); + Vector3 move = new Vector3(offset.x * PanSpeed, 0, offset.y * PanSpeed); + transform.Translate(move, Space.World); + ClampToBounds(); + + lastPanPosition = newPanPosition; + } + + void ZoomCamera(float offset, float speed) { + if (!zoomActive || offset == 0) { + return; + } + + cam.fieldOfView = Mathf.Clamp(cam.fieldOfView - (offset * speed), ZoomBounds[0], ZoomBounds[1]); + } + + void ClampToBounds() { + Vector3 pos = transform.position; + pos.x = Mathf.Clamp(transform.position.x, BoundsX[0], BoundsX[1]); + pos.z = Mathf.Clamp(transform.position.z, BoundsZ[0], BoundsZ[1]); + + transform.position = pos; + } + + + +}
\ No newline at end of file |