using UnityEngine; namespace Code.Gameplay.Camera.CameraStates { /* * Состояние камеры от третьего лица * Камера следует за персонажем на заданном расстоянии * Поддерживает зум, плавное следование и вращение с учётом угла наклона * Дистанция и углы настраиваются через конфигурацию */ public class ThirdPersonState : BaseCameraState, ICameraState { public ThirdPersonState(CameraStateMachineContext context) : base(context) { } public override void EnterState() { // Восстанавливаем исходные значения дистанции MinDistance = OriginalMinDistance; MaxDistance = OriginalMaxDistance; DefaultDistance = OriginalDefaultDistance; TargetDistance = DefaultDistance; base.EnterState(); } protected override void HandlePosition(float deltaTime, float zoomInput, Quaternion targetRotation) { // Обновление целевой дистанции на основе ввода зума TargetDistance += zoomInput * DistanceMovementSpeed; TargetDistance = Mathf.Clamp(TargetDistance, MinDistance, MaxDistance); // Плавное следование за целью с использованием экспоненциального сглаживания CurrentFollowPosition = Vector3.Lerp( CurrentFollowPosition, FollowTransform.position, 1f - Mathf.Exp(-FollowSharpness * deltaTime) ); // В ThirdPerson режиме камера отодвинута на расстояние от цели var targetPosition = CurrentFollowPosition - targetRotation * Vector3.forward * CurrentDistance; // Плавное изменение текущей дистанции к целевой CurrentDistance = Mathf.Lerp( CurrentDistance, TargetDistance, 1f - Mathf.Exp(-DistanceMovementSpeed * deltaTime) ); // Установка финальной позиции камеры Camera.transform.position = targetPosition; } public CameraMode GetCameraMode() { return CameraMode.ThirdPerson; } } }