45 lines
2.0 KiB
C#
45 lines
2.0 KiB
C#
using UnityEngine;
|
||
|
||
namespace Code.Gameplay.Camera.CameraStates
|
||
{
|
||
/*
|
||
* Состояние камеры от первого лица
|
||
* Камера размещается непосредственно на позиции цели (например, на уровне глаз персонажа)
|
||
* Дистанция до цели принудительно устанавливается в 0
|
||
* Вращение управляется мышью, позиция следует за целью без отступа
|
||
*/
|
||
public class FirstPersonState : BaseCameraState, ICameraState
|
||
{
|
||
public FirstPersonState(CameraStateMachineContext context) : base(context) { }
|
||
|
||
public override void EnterState()
|
||
{
|
||
base.EnterState();
|
||
|
||
// В FirstPerson режиме дистанция всегда равна 0
|
||
MinDistance = 0f;
|
||
MaxDistance = 0f;
|
||
DefaultDistance = 0f;
|
||
TargetDistance = 0f;
|
||
CurrentDistance = 0f;
|
||
|
||
Camera.fieldOfView = Context.CameraSettingsConfigs[CameraMode.FirstPerson].fov;
|
||
}
|
||
|
||
protected override void HandlePosition(float deltaTime, float zoomInput, Quaternion targetRotation)
|
||
{
|
||
// Плавное следование за целью с использованием экспоненциального сглаживания
|
||
CurrentFollowPosition = Vector3.Lerp(CurrentFollowPosition, FollowTransform.position, 1f - Mathf.Exp(-FollowSharpness * deltaTime));
|
||
|
||
// В FirstPerson режиме камера находится прямо на позиции цели
|
||
var targetPosition = CurrentFollowPosition;
|
||
|
||
// Установка финальной позиции камеры
|
||
Camera.transform.position = targetPosition;
|
||
}
|
||
public CameraMode GetCameraMode()
|
||
{
|
||
return CameraMode.FirstPerson;
|
||
}
|
||
}
|
||
} |