TurnBasedStrategyCourse/Assets/Scripts/CameraController.cs

54 lines
2.1 KiB
C#

using Cinemachine;
using UnityEngine;
public class CameraController : MonoBehaviour {
private const float minFollowYOffset = 2f;
private const float maxFollowYOffset = 12f;
[SerializeField] private float MoveSpeed = 10f;
[SerializeField] private float RotationSpeed = 100f;
[SerializeField] private float ZoomAmount = 1f;
[SerializeField] private float ZoomSpeed = 5f;
[SerializeField] private CinemachineVirtualCamera CinemachineVirtualCamera;
private CinemachineTransposer cinemachineTransposer;
private Vector3 targetFollowOffset;
private void Awake() => cinemachineTransposer = CinemachineVirtualCamera.GetCinemachineComponent<CinemachineTransposer>();
private void Start() => targetFollowOffset = cinemachineTransposer.m_FollowOffset;
private void Update() {
HandleMovement();
HandleRotation();
HandleZoom();
}
private void HandleMovement() {
Vector3 inputMoveDir = new();
if (Input.GetKey(KeyCode.W)) inputMoveDir.z = +1f;
if (Input.GetKey(KeyCode.S)) inputMoveDir.z = -1f;
if (Input.GetKey(KeyCode.A)) inputMoveDir.x = -1f;
if (Input.GetKey(KeyCode.D)) inputMoveDir.x = +1f;
transform.position += Time.deltaTime * MoveSpeed * (transform.forward * inputMoveDir.z + transform.right * inputMoveDir.x);
}
private void HandleRotation() {
Vector3 rotationVector = new();
if (Input.GetKey(KeyCode.Q)) rotationVector.y = +1f;
if (Input.GetKey(KeyCode.E)) rotationVector.y = -1f;
transform.eulerAngles += Time.deltaTime * RotationSpeed * rotationVector;
}
private void HandleZoom() {
switch (Input.mouseScrollDelta.y) {
case > 0:
targetFollowOffset.y -= ZoomAmount;
break;
case < 0:
targetFollowOffset.y += ZoomAmount;
break;
}
targetFollowOffset.y = Mathf.Clamp(targetFollowOffset.y, minFollowYOffset, maxFollowYOffset);
cinemachineTransposer.m_FollowOffset = Vector3.Lerp(cinemachineTransposer.m_FollowOffset, targetFollowOffset, ZoomSpeed * Time.deltaTime);
}
}