/
KirRo
/
Test_1
Обзор
Документация
Войти
/
KirRo
/
Test_1
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Assets/_Project/Scripts/PlayerCameraMotor.cs
149 строк
4 KB
KirRo
Правки. Разделена логика игрока, камеры, UI, Object Pool. Ожидание сервисов ввода и аудио
30 июл 2026, 22:37
30 июл 2026, 22:37
d3abbab
Код
Авторство
О чём код?
using UnityEngine; public class PlayerCameraMotor : MonoBehaviour { private enum CameraMode { FirstPerson, ThirdPerson } private const float FIRST_PERSON_RUN_Z_OFFSET = 0.35f; [Header("References")] [SerializeField] private Transform _target; [SerializeField] private Transform _firstPersonPoint; [SerializeField] private Transform _thirdPersonPoint; [SerializeField] private Camera _camera; [Header("First Person Pitch")] [SerializeField] private float _firstPersonMinPitch = -80f; [SerializeField] private float _firstPersonMaxPitch = 80f; [Header("Third Person Pitch")] [SerializeField] private float _thirdPersonMinPitch = -20f; [SerializeField] private float _thirdPersonMaxPitch = 35f; [Header("Follow")] [SerializeField] private float _positionSmoothness = 12f; [SerializeField] private float _rotationSmoothness = 12f; [Header("FOV")] [SerializeField] private float _defaultFov = 60f; [SerializeField] private float _runningFov = 68f; [SerializeField] private float _fovSmoothness = 8f; [SerializeField] private CameraMode _cameraMode = CameraMode.ThirdPerson; private Vector3 _firstPersonDefaultLocalPosition; private float _pitch; private void Awake() { _camera ??= GetComponent<Camera>(); if (_firstPersonPoint != null) { _firstPersonDefaultLocalPosition = _firstPersonPoint.localPosition; } } public void SwitchCameraMode() { _cameraMode = _cameraMode == CameraMode.FirstPerson ? CameraMode.ThirdPerson : CameraMode.FirstPerson; ClampPitch(); } public void RotatePitch(float mouseY) { _pitch -= mouseY; ClampPitch(); } public void UpdateCamera(bool isRunning, bool isRunningForward) { UpdateFirstPersonPoint(isRunningForward); MoveCamera(); RotateCamera(); UpdateFieldOfView(isRunning); } private void UpdateFirstPersonPoint(bool isRunningForward) { if (_firstPersonPoint == null) { return; } var targetLocalPosition = _firstPersonDefaultLocalPosition; if (isRunningForward) { targetLocalPosition += Vector3.forward * FIRST_PERSON_RUN_Z_OFFSET; } _firstPersonPoint.localPosition = targetLocalPosition; } private void MoveCamera() { var targetPoint = GetCurrentCameraPoint(); transform.position = Vector3.Lerp( transform.position, targetPoint.position, _positionSmoothness * Time.deltaTime ); } private void RotateCamera() { var targetRotation = Quaternion.Euler( _pitch, _target.eulerAngles.y, 0f ); transform.rotation = Quaternion.Lerp( transform.rotation, targetRotation, _rotationSmoothness * Time.deltaTime ); } private void UpdateFieldOfView(bool isRunning) { var targetFov = isRunning ? _runningFov : _defaultFov; _camera.fieldOfView = Mathf.Lerp( _camera.fieldOfView, targetFov, _fovSmoothness * Time.deltaTime ); } private void ClampPitch() { var minPitch = _cameraMode == CameraMode.FirstPerson ? _firstPersonMinPitch : _thirdPersonMinPitch; var maxPitch = _cameraMode == CameraMode.FirstPerson ? _firstPersonMaxPitch : _thirdPersonMaxPitch; _pitch = Mathf.Clamp(_pitch, minPitch, maxPitch); } private Transform GetCurrentCameraPoint() { return _cameraMode == CameraMode.FirstPerson ? _firstPersonPoint : _thirdPersonPoint; } }