117 lines
5.0 KiB
C#
117 lines
5.0 KiB
C#
using Code.Gameplay.Player;
|
|
using Code.Input;
|
|
using Reflex.Attributes;
|
|
using UnityEngine;
|
|
using CharacterController = Code.Gameplay.Player.CharacterController;
|
|
|
|
/*
|
|
* Главный скрипт игрока, объединяющий камеру и контроллер персонажа
|
|
* Обрабатывает ввод пользователя и распределяет его между компонентами
|
|
* Синхронизирует состояние камеры и персонажа
|
|
* Управляет переключением режимов камеры через Input System
|
|
*/
|
|
public class Player : MonoBehaviour
|
|
{
|
|
[SerializeField]
|
|
private PlayerCamera playerCamera; // Компонент камеры игрока
|
|
[SerializeField]
|
|
private CharacterController characterController; // Компонент управления персонажем
|
|
[SerializeField]
|
|
private Transform cameraFollowPoint; // Точка следования камеры (уровень глаз для FirstPerson)
|
|
|
|
[Inject]
|
|
private IInputService _inputService; // Сервис ввода через DI
|
|
|
|
// Флаг для отслеживания переключения режима камеры (чтобы избежать многократных срабатываний)
|
|
private bool _cameraModeToggleHandled;
|
|
|
|
// Инициализация игрока
|
|
private void Start()
|
|
{
|
|
// Настройка камеры для следования за точкой камеры
|
|
playerCamera.SetFollowTransform(cameraFollowPoint);
|
|
|
|
// Включение Gameplay мапа ввода
|
|
_inputService.EnableMap(ActionMappings.Gameplay);
|
|
}
|
|
|
|
// Обработка ввода для камеры (вращение и зум)
|
|
private void HandleCameraInput()
|
|
{
|
|
// Получаем данные ввода из Input System
|
|
var lookInput = _inputService.LookInput;
|
|
var scrollInput = _inputService.ZoomInput;
|
|
|
|
// Передаем данные в камеру
|
|
playerCamera.UpdateWithInput(Time.deltaTime, scrollInput,
|
|
new Vector3(lookInput.x, lookInput.y, 0));
|
|
}
|
|
|
|
// Обработка ввода для движения персонажа
|
|
private void HandleCharacterInput()
|
|
{
|
|
// Создаем структуру ввода с полной информацией о камере
|
|
var inputs = new PlayerInputs();
|
|
|
|
// Получаем данные движения из Input System
|
|
var moveInput = _inputService.MoveInput;
|
|
inputs.MoveAxisForward = moveInput.y; // Vertical ось (W/S или Up/Down)
|
|
inputs.MoveAxisRight = moveInput.x; // Horizontal ось (A/D или Left/Right)
|
|
|
|
// Передаем информацию о камере для адаптивного поведения
|
|
inputs.CameraRotation = playerCamera.transform.rotation;
|
|
inputs.CameraMode = playerCamera.CurrentMode;
|
|
inputs.CameraPlanarDirection = playerCamera.PlanarDirection;
|
|
|
|
// Передаем ввод в контроллер персонажа
|
|
characterController.SetInputs(ref inputs);
|
|
}
|
|
|
|
// Обработка переключения режима камеры через Input System
|
|
private void HandleCameraModeInput()
|
|
{
|
|
// Получаем состояние переключения режима камеры из Input System
|
|
var togglePressed = _inputService.ToggleCameraModePressed;
|
|
|
|
switch (togglePressed)
|
|
{
|
|
// Обрабатываем нажатие только один раз при первом обнаружении
|
|
case true when !_cameraModeToggleHandled:
|
|
ToggleCameraMode();
|
|
_cameraModeToggleHandled = true;
|
|
break;
|
|
// Сбрасываем флаг когда кнопка отпущена
|
|
case false:
|
|
_cameraModeToggleHandled = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Метод для переключения режимов камеры
|
|
private void ToggleCameraMode()
|
|
{
|
|
var currentMode = playerCamera.CurrentMode;
|
|
var newMode = currentMode == CameraMode.FirstPerson ?
|
|
CameraMode.ThirdPerson : CameraMode.FirstPerson;
|
|
|
|
playerCamera.SetCameraMode(newMode);
|
|
}
|
|
|
|
// Обновление логики каждый кадр
|
|
private void Update()
|
|
{
|
|
// Обработка ввода для движения в Update (физика)
|
|
HandleCharacterInput();
|
|
|
|
// Обработка переключения режима камеры
|
|
HandleCameraModeInput();
|
|
}
|
|
|
|
// Обновление после всех вычислений (идеально для камеры)
|
|
private void LateUpdate()
|
|
{
|
|
// Обработка ввода для камеры в LateUpdate (после движения персонажа)
|
|
HandleCameraInput();
|
|
}
|
|
}
|