Files
CourierOld/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs
T

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();
}
}