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(); 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); } }