58 lines
2.5 KiB
C#
58 lines
2.5 KiB
C#
using UnityEngine;
|
||
|
||
namespace Code.Gameplay.Camera.CameraStates
|
||
{
|
||
/*
|
||
* Состояние камеры от третьего лица
|
||
* Камера следует за персонажем на заданном расстоянии
|
||
* Поддерживает зум, плавное следование и вращение с учётом угла наклона
|
||
* Дистанция и углы настраиваются через конфигурацию
|
||
*/
|
||
public class ThirdPersonState : BaseCameraState, ICameraState
|
||
{
|
||
public ThirdPersonState(CameraStateMachineContext context) : base(context) { }
|
||
|
||
public override void EnterState()
|
||
{
|
||
base.EnterState();
|
||
|
||
// Восстанавливаем исходные значения дистанции
|
||
MinDistance = OriginalMinDistance;
|
||
MaxDistance = OriginalMaxDistance;
|
||
DefaultDistance = OriginalDefaultDistance;
|
||
TargetDistance = DefaultDistance;
|
||
}
|
||
|
||
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;
|
||
}
|
||
}
|
||
} |