summaryrefslogtreecommitdiff
path: root/Pathfinding Visualizer/Assets/TextMesh Pro/Examples & Extras/Scripts/CameraController.cs
diff options
context:
space:
mode:
authordereelatwit <54997325+dereelatwit@users.noreply.github.com>2023-08-03 14:05:08 -0400
committerdereelatwit <54997325+dereelatwit@users.noreply.github.com>2023-08-03 14:05:08 -0400
commitb8aa2e0935f309b112648f0352f35f5f33da946b (patch)
tree9121ae1a65e483dddba8367cbbdd4991abfb3e26 /Pathfinding Visualizer/Assets/TextMesh Pro/Examples & Extras/Scripts/CameraController.cs
parent374125ba34e0366afb062578906877cfdf229bb9 (diff)
started implementing UI
Diffstat (limited to 'Pathfinding Visualizer/Assets/TextMesh Pro/Examples & Extras/Scripts/CameraController.cs')
-rw-r--r--Pathfinding Visualizer/Assets/TextMesh Pro/Examples & Extras/Scripts/CameraController.cs292
1 files changed, 292 insertions, 0 deletions
diff --git a/Pathfinding Visualizer/Assets/TextMesh Pro/Examples & Extras/Scripts/CameraController.cs b/Pathfinding Visualizer/Assets/TextMesh Pro/Examples & Extras/Scripts/CameraController.cs
new file mode 100644
index 0000000..dad1482
--- /dev/null
+++ b/Pathfinding Visualizer/Assets/TextMesh Pro/Examples & Extras/Scripts/CameraController.cs
@@ -0,0 +1,292 @@
+using UnityEngine;
+using System.Collections;
+
+
+namespace TMPro.Examples
+{
+
+ public class CameraController : MonoBehaviour
+ {
+ public enum CameraModes { Follow, Isometric, Free }
+
+ private Transform cameraTransform;
+ private Transform dummyTarget;
+
+ public Transform CameraTarget;
+
+ public float FollowDistance = 30.0f;
+ public float MaxFollowDistance = 100.0f;
+ public float MinFollowDistance = 2.0f;
+
+ public float ElevationAngle = 30.0f;
+ public float MaxElevationAngle = 85.0f;
+ public float MinElevationAngle = 0f;
+
+ public float OrbitalAngle = 0f;
+
+ public CameraModes CameraMode = CameraModes.Follow;
+
+ public bool MovementSmoothing = true;
+ public bool RotationSmoothing = false;
+ private bool previousSmoothing;
+
+ public float MovementSmoothingValue = 25f;
+ public float RotationSmoothingValue = 5.0f;
+
+ public float MoveSensitivity = 2.0f;
+
+ private Vector3 currentVelocity = Vector3.zero;
+ private Vector3 desiredPosition;
+ private float mouseX;
+ private float mouseY;
+ private Vector3 moveVector;
+ private float mouseWheel;
+
+ // Controls for Touches on Mobile devices
+ //private float prev_ZoomDelta;
+
+
+ private const string event_SmoothingValue = "Slider - Smoothing Value";
+ private const string event_FollowDistance = "Slider - Camera Zoom";
+
+
+ void Awake()
+ {
+ if (QualitySettings.vSyncCount > 0)
+ Application.targetFrameRate = 60;
+ else
+ Application.targetFrameRate = -1;
+
+ if (Application.platform == RuntimePlatform.IPhonePlayer || Application.platform == RuntimePlatform.Android)
+ Input.simulateMouseWithTouches = false;
+
+ cameraTransform = transform;
+ previousSmoothing = MovementSmoothing;
+ }
+
+
+ // Use this for initialization
+ void Start()
+ {
+ if (CameraTarget == null)
+ {
+ // If we don't have a target (assigned by the player, create a dummy in the center of the scene).
+ dummyTarget = new GameObject("Camera Target").transform;
+ CameraTarget = dummyTarget;
+ }
+ }
+
+ // Update is called once per frame
+ void LateUpdate()
+ {
+ GetPlayerInput();
+
+
+ // Check if we still have a valid target
+ if (CameraTarget != null)
+ {
+ if (CameraMode == CameraModes.Isometric)
+ {
+ desiredPosition = CameraTarget.position + Quaternion.Euler(ElevationAngle, OrbitalAngle, 0f) * new Vector3(0, 0, -FollowDistance);
+ }
+ else if (CameraMode == CameraModes.Follow)
+ {
+ desiredPosition = CameraTarget.position + CameraTarget.TransformDirection(Quaternion.Euler(ElevationAngle, OrbitalAngle, 0f) * (new Vector3(0, 0, -FollowDistance)));
+ }
+ else
+ {
+ // Free Camera implementation
+ }
+
+ if (MovementSmoothing == true)
+ {
+ // Using Smoothing
+ cameraTransform.position = Vector3.SmoothDamp(cameraTransform.position, desiredPosition, ref currentVelocity, MovementSmoothingValue * Time.fixedDeltaTime);
+ //cameraTransform.position = Vector3.Lerp(cameraTransform.position, desiredPosition, Time.deltaTime * 5.0f);
+ }
+ else
+ {
+ // Not using Smoothing
+ cameraTransform.position = desiredPosition;
+ }
+
+ if (RotationSmoothing == true)
+ cameraTransform.rotation = Quaternion.Lerp(cameraTransform.rotation, Quaternion.LookRotation(CameraTarget.position - cameraTransform.position), RotationSmoothingValue * Time.deltaTime);
+ else
+ {
+ cameraTransform.LookAt(CameraTarget);
+ }
+
+ }
+
+ }
+
+
+
+ void GetPlayerInput()
+ {
+ moveVector = Vector3.zero;
+
+ // Check Mouse Wheel Input prior to Shift Key so we can apply multiplier on Shift for Scrolling
+ mouseWheel = Input.GetAxis("Mouse ScrollWheel");
+
+ float touchCount = Input.touchCount;
+
+ if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift) || touchCount > 0)
+ {
+ mouseWheel *= 10;
+
+ if (Input.GetKeyDown(KeyCode.I))
+ CameraMode = CameraModes.Isometric;
+
+ if (Input.GetKeyDown(KeyCode.F))
+ CameraMode = CameraModes.Follow;
+
+ if (Input.GetKeyDown(KeyCode.S))
+ MovementSmoothing = !MovementSmoothing;
+
+
+ // Check for right mouse button to change camera follow and elevation angle
+ if (Input.GetMouseButton(1))
+ {
+ mouseY = Input.GetAxis("Mouse Y");
+ mouseX = Input.GetAxis("Mouse X");
+
+ if (mouseY > 0.01f || mouseY < -0.01f)
+ {
+ ElevationAngle -= mouseY * MoveSensitivity;
+ // Limit Elevation angle between min & max values.
+ ElevationAngle = Mathf.Clamp(ElevationAngle, MinElevationAngle, MaxElevationAngle);
+ }
+
+ if (mouseX > 0.01f || mouseX < -0.01f)
+ {
+ OrbitalAngle += mouseX * MoveSensitivity;
+ if (OrbitalAngle > 360)
+ OrbitalAngle -= 360;
+ if (OrbitalAngle < 0)
+ OrbitalAngle += 360;
+ }
+ }
+
+ // Get Input from Mobile Device
+ if (touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved)
+ {
+ Vector2 deltaPosition = Input.GetTouch(0).deltaPosition;
+
+ // Handle elevation changes
+ if (deltaPosition.y > 0.01f || deltaPosition.y < -0.01f)
+ {
+ ElevationAngle -= deltaPosition.y * 0.1f;
+ // Limit Elevation angle between min & max values.
+ ElevationAngle = Mathf.Clamp(ElevationAngle, MinElevationAngle, MaxElevationAngle);
+ }
+
+
+ // Handle left & right
+ if (deltaPosition.x > 0.01f || deltaPosition.x < -0.01f)
+ {
+ OrbitalAngle += deltaPosition.x * 0.1f;
+ if (OrbitalAngle > 360)
+ OrbitalAngle -= 360;
+ if (OrbitalAngle < 0)
+ OrbitalAngle += 360;
+ }
+
+ }
+
+ // Check for left mouse button to select a new CameraTarget or to reset Follow position
+ if (Input.GetMouseButton(0))
+ {
+ Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
+ RaycastHit hit;
+
+ if (Physics.Raycast(ray, out hit, 300, 1 << 10 | 1 << 11 | 1 << 12 | 1 << 14))
+ {
+ if (hit.transform == CameraTarget)
+ {
+ // Reset Follow Position
+ OrbitalAngle = 0;
+ }
+ else
+ {
+ CameraTarget = hit.transform;
+ OrbitalAngle = 0;
+ MovementSmoothing = previousSmoothing;
+ }
+
+ }
+ }
+
+
+ if (Input.GetMouseButton(2))
+ {
+ if (dummyTarget == null)
+ {
+ // We need a Dummy Target to anchor the Camera
+ dummyTarget = new GameObject("Camera Target").transform;
+ dummyTarget.position = CameraTarget.position;
+ dummyTarget.rotation = CameraTarget.rotation;
+ CameraTarget = dummyTarget;
+ previousSmoothing = MovementSmoothing;
+ MovementSmoothing = false;
+ }
+ else if (dummyTarget != CameraTarget)
+ {
+ // Move DummyTarget to CameraTarget
+ dummyTarget.position = CameraTarget.position;
+ dummyTarget.rotation = CameraTarget.rotation;
+ CameraTarget = dummyTarget;
+ previousSmoothing = MovementSmoothing;
+ MovementSmoothing = false;
+ }
+
+
+ mouseY = Input.GetAxis("Mouse Y");
+ mouseX = Input.GetAxis("Mouse X");
+
+ moveVector = cameraTransform.TransformDirection(mouseX, mouseY, 0);
+
+ dummyTarget.Translate(-moveVector, Space.World);
+
+ }
+
+ }
+
+ // Check Pinching to Zoom in - out on Mobile device
+ if (touchCount == 2)
+ {
+ Touch touch0 = Input.GetTouch(0);
+ Touch touch1 = Input.GetTouch(1);
+
+ Vector2 touch0PrevPos = touch0.position - touch0.deltaPosition;
+ Vector2 touch1PrevPos = touch1.position - touch1.deltaPosition;
+
+ float prevTouchDelta = (touch0PrevPos - touch1PrevPos).magnitude;
+ float touchDelta = (touch0.position - touch1.position).magnitude;
+
+ float zoomDelta = prevTouchDelta - touchDelta;
+
+ if (zoomDelta > 0.01f || zoomDelta < -0.01f)
+ {
+ FollowDistance += zoomDelta * 0.25f;
+ // Limit FollowDistance between min & max values.
+ FollowDistance = Mathf.Clamp(FollowDistance, MinFollowDistance, MaxFollowDistance);
+ }
+
+
+ }
+
+ // Check MouseWheel to Zoom in-out
+ if (mouseWheel < -0.01f || mouseWheel > 0.01f)
+ {
+
+ FollowDistance -= mouseWheel * 5.0f;
+ // Limit FollowDistance between min & max values.
+ FollowDistance = Mathf.Clamp(FollowDistance, MinFollowDistance, MaxFollowDistance);
+ }
+
+
+ }
+ }
+} \ No newline at end of file