aboutsummaryrefslogtreecommitdiff
path: root/td/Assets/Scripts/PinchZoom.cs
diff options
context:
space:
mode:
authorJakob Stendahl <jakst070500@ntvgs.no>2017-09-29 12:42:11 +0200
committerJakob Stendahl <jakst070500@ntvgs.no>2017-09-29 12:42:11 +0200
commit76cf99ade6530bdad81088295fb4cf73f5c5b118 (patch)
treee3cf549687d164c11d6b292d771534e98bcc97a8 /td/Assets/Scripts/PinchZoom.cs
parent608b6a0e692a580f0dfabef0b2ef1a59f0a37234 (diff)
parent9a00d03f80eee94c9fe52f832a0127d9375ad375 (diff)
downloadTD-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.cs144
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