Добавлено нормальное переключение между FirstPerson и ThirdPerson камерами, правильная логика работы FirstPerson камеры (игрок поворачивается вместе с ней), добавлены заготовки для других камер, стабилизированы настройки камеры. Перехожу к движению

This commit is contained in:
MrTorex committed 2025-10-17 12:07:48 +03:00
1 parent 8981457f2d
commit bd0cee77a6
11 files changed
+760 -87

No files matched your search

@@ -3,22 +3,26 @@ using UnityEngine;
namespace Code.Gameplay.Player namespace Code.Gameplay.Player
{ {
/*
* Структура для хранения входных данных от игрока
* Содержит информацию о движении и состоянии камеры
*/
public struct PlayerInputs
{
public float MoveAxisForward; // Ввод движения вперед/назад (W/S или Up/Down)
public float MoveAxisRight; // Ввод движения влево/вправо (A/D или Left/Right)
public Quaternion CameraRotation; // Текущее вращение камеры для определения направления движения
public CameraMode CameraMode; // Текущий режим камеры для адаптации поведения
public Vector3 CameraPlanarDirection; // Направление камеры в горизонтальной плоскости
}
/* /*
* Скрипт, отвечающий за передвижения игрока * Скрипт, отвечающий за передвижения игрока
* Реализует физическое движение персонажа с использованием Kinematic Character Controller * Реализует физическое движение персонажа с использованием Kinematic Character Controller
* Обрабатывает ввод пользователя, применяет движение и вращение с учетом поверхности * Обрабатывает ввод пользователя, применяет движение и вращение с учетом поверхности
* *
* Источник: Tvtig, https://www.youtube.com/watch?v=9ibpY64wBYM * Источник: Tvtig, https://www.youtube.com/watch?v=9ibpY64wBYM
*/ */
// Структура для хранения входных данных от игрока
public struct PlayerInputs
{
public float MoveAxisForward; // Ввод движения вперед/назад (W/S или Up/Down)
public float MoveAxisRight; // Ввод движения влево/вправо (A/D или Left/Right)
public Quaternion CameraRotation; // Текущее вращение камеры для определения направления движения
}
public class CharacterController : MonoBehaviour, ICharacterController public class CharacterController : MonoBehaviour, ICharacterController
{ {
[SerializeField] [SerializeField]
@@ -33,54 +37,143 @@ namespace Code.Gameplay.Player
// Векторы движения и направления взгляда // Векторы движения и направления взгляда
private Vector3 _moveInputVector, _lookInputVector; private Vector3 _moveInputVector, _lookInputVector;
// Текущий режим камеры для адаптации поведения
private CameraMode _currentCameraMode = CameraMode.ThirdPerson;
// Вращение камеры в FirstPerson режиме для синхронизации (только горизонтальная компонента)
private Quaternion _firstPersonCameraRotation;
// Флаг указывающий, что нужно применить вращение камеры к персонажу
private bool _shouldApplyCameraRotation;
// Инициализация контроллера // Инициализация контроллера
private void Start() private void Start()
{ {
motor.CharacterController = this; // Регистрация этого контроллера в движке motor.CharacterController = this; // Регистрация этого контроллера в движке
_firstPersonCameraRotation = motor.Transform.rotation; // Начальное вращение совпадает с персонажем
} }
// Обработка и преобразование входных данных от игрока // Обработка и преобразование входных данных от игрока
public void SetInputs(ref PlayerInputs inputs) public void SetInputs(ref PlayerInputs inputs)
{ {
// Сохраняем текущий режим камеры
_currentCameraMode = inputs.CameraMode;
// Нормализация вектора движения и ограничение его величины до 1 // Нормализация вектора движения и ограничение его величины до 1
Vector3 moveInputVector = var moveInputVector =
Vector3.ClampMagnitude(new Vector3(inputs.MoveAxisRight, 0, inputs.MoveAxisForward), 1f); Vector3.ClampMagnitude(new Vector3(inputs.MoveAxisRight, 0, inputs.MoveAxisForward), 1f);
// Раздельная обработка в зависимости от режима камеры
if (_currentCameraMode == CameraMode.FirstPerson)
{
HandleFirstPersonInputs(ref inputs, moveInputVector);
}
else
{
HandleThirdPersonInputs(ref inputs, moveInputVector);
}
}
// Обработка ввода для FirstPerson режима
private void HandleFirstPersonInputs(ref PlayerInputs inputs, Vector3 moveInputVector)
{
// Сохраняем вращение камеры для применения в UpdateRotation (только горизонтальная компонента)
_firstPersonCameraRotation = ExtractHorizontalRotation(inputs.CameraRotation);
_shouldApplyCameraRotation = true;
// В FirstPerson режиме движение всегда относительно направления камеры
// Получаем направление камеры в горизонтальной плоскости
var cameraPlanarDirection = inputs.CameraPlanarDirection;
// Создание вращения на основе направления камеры
var cameraPlanarRotation = Quaternion.LookRotation(cameraPlanarDirection, motor.CharacterUp);
// Преобразование локального ввода в мировые координаты относительно камеры
_moveInputVector = cameraPlanarRotation * moveInputVector;
// В FirstPerson режиме направление взгляда всегда совпадает с направлением камеры (горизонтально)
_lookInputVector = cameraPlanarDirection;
}
// Обработка ввода для ThirdPerson режима
private void HandleThirdPersonInputs(ref PlayerInputs inputs, Vector3 moveInputVector)
{
// Сбрасываем флаг применения вращения камеры
_shouldApplyCameraRotation = false;
// Получение направления камеры в горизонтальной плоскости (игнорируя наклон) // Получение направления камеры в горизонтальной плоскости (игнорируя наклон)
Vector3 cameraPlanarDirection = var cameraPlanarDirection = inputs.CameraPlanarDirection;
Vector3.ProjectOnPlane(inputs.CameraRotation * Vector3.forward, motor.CharacterUp).normalized;
// Резервный расчет направления, если основное направление параллельно вертикали // Резервный расчет направления, если основное направление параллельно вертикали
if (cameraPlanarDirection.sqrMagnitude == 0f) if (cameraPlanarDirection.sqrMagnitude == 0f)
{ {
cameraPlanarDirection = Vector3.ProjectOnPlane(inputs.CameraRotation * Vector3.up, motor.CharacterUp); cameraPlanarDirection = Vector3.ProjectOnPlane(inputs.CameraRotation * Vector3.up, motor.CharacterUp);
} }
// Создание вращения на основе направления камеры // Создание вращения на основе направления камеры
Quaternion cameraPlanarRotation = Quaternion.LookRotation(cameraPlanarDirection, motor.CharacterUp); var cameraPlanarRotation = Quaternion.LookRotation(cameraPlanarDirection, motor.CharacterUp);
// Преобразование локального ввода в мировые координаты относительно камеры // Преобразование локального ввода в мировые координаты относительно камеры
_moveInputVector = cameraPlanarRotation * moveInputVector; _moveInputVector = cameraPlanarRotation * moveInputVector;
// Направление взгляда совпадает с направлением движения (нормализованное) // Направление взгляда совпадает с направлением движения (нормализованное)
_lookInputVector = _moveInputVector.normalized; _lookInputVector = _moveInputVector.normalized;
} }
// Извлечение только горизонтальной компоненты вращения (игнорируя наклон камеры)
private Quaternion ExtractHorizontalRotation(Quaternion cameraRotation)
{
// Получаем вектор направления камеры
var cameraForward = cameraRotation * Vector3.forward;
// Проецируем на горизонтальную плоскость
var horizontalForward = Vector3.ProjectOnPlane(cameraForward, motor.CharacterUp).normalized;
// Если проекция вырождена, используем текущее направление персонажа
if (horizontalForward.sqrMagnitude < 0.01f)
{
horizontalForward = motor.CharacterForward;
}
// Создаем вращение только по горизонтали
return Quaternion.LookRotation(horizontalForward, motor.CharacterUp);
}
// Обновление вращения персонажа на основе входных данных // Обновление вращения персонажа на основе входных данных
public void UpdateRotation(ref Quaternion currentRotation, float deltaTime) public void UpdateRotation(ref Quaternion currentRotation, float deltaTime)
{ {
// Вращение применяется только если есть направление движения и разрешена резкость вращения switch (_currentCameraMode)
if (_lookInputVector.sqrMagnitude > 0 && orientationSharpness > 0)
{ {
// Плавная интерполяция текущего направления к целевому с экспоненциальным сглаживанием // В FirstPerson режиме применяем вращение камеры напрямую к персонажу (только горизонталь)
Vector3 smoothedLookInputDirection = Vector3.Slerp( case CameraMode.FirstPerson when _shouldApplyCameraRotation:
motor.CharacterForward, // Немедленно применяем горизонтальное вращение камеры к персонажу
_lookInputVector, currentRotation = _firstPersonCameraRotation;
1f - Mathf.Exp(-orientationSharpness * deltaTime) _shouldApplyCameraRotation = false;
).normalized; break;
// В ThirdPerson режиме плавно поворачиваем персонаж в направлении движения
// Установка нового вращения смотря в сглаженном направлении case CameraMode.ThirdPerson:
currentRotation = Quaternion.LookRotation(smoothedLookInputDirection, motor.CharacterUp); {
// Вращение применяется только если есть направление движения и разрешена резкость вращения
if (_lookInputVector.sqrMagnitude > 0 && orientationSharpness > 0)
{
// Плавная интерполяция текущего направления к целевому с экспоненциальным сглаживанием
var smoothedLookInputDirection = Vector3.Slerp(
motor.CharacterForward,
_lookInputVector,
1f - Mathf.Exp(-orientationSharpness * deltaTime)
).normalized;
// Установка нового вращения смотря в сглаженном направлении
currentRotation = Quaternion.LookRotation(smoothedLookInputDirection, motor.CharacterUp);
}
break;
}
// Заготовка на будущее (если понадобится)
case CameraMode.Static:
case CameraMode.Cinematic:
default:
break;
} }
} }
@@ -88,20 +181,20 @@ namespace Code.Gameplay.Player
public void UpdateVelocity(ref Vector3 currentVelocity, float deltaTime) public void UpdateVelocity(ref Vector3 currentVelocity, float deltaTime)
{ {
// Сохранение текущей величины скорости // Сохранение текущей величины скорости
float currentVelocityMagnitude = currentVelocity.magnitude; var currentVelocityMagnitude = currentVelocity.magnitude;
// Получение нормали поверхности для корректного движения по наклонным плоскостям // Получение нормали поверхности для корректного движения по наклонным плоскостям
Vector3 effectiveGroundNormal = motor.GroundingStatus.GroundNormal; var effectiveGroundNormal = motor.GroundingStatus.GroundNormal;
// Переориентация текущей скорости вдоль поверхности // Переориентация текущей скорости вдоль поверхности
currentVelocity = motor.GetDirectionTangentToSurface(currentVelocity, effectiveGroundNormal) * currentVelocityMagnitude; currentVelocity = motor.GetDirectionTangentToSurface(currentVelocity, effectiveGroundNormal) * currentVelocityMagnitude;
// Переориентация входного вектора движения вдоль поверхности // Переориентация входного вектора движения вдоль поверхности
Vector3 inputRight = Vector3.Cross(_moveInputVector, motor.CharacterUp); var inputRight = Vector3.Cross(_moveInputVector, motor.CharacterUp);
Vector3 reorientedInput = Vector3.Cross(effectiveGroundNormal, inputRight).normalized * _moveInputVector.magnitude; var reorientedInput = Vector3.Cross(effectiveGroundNormal, inputRight).normalized * _moveInputVector.magnitude;
// Расчет целевой скорости движения с учетом ограничения максимальной скорости // Расчет целевой скорости движения с учетом ограничения максимальной скорости
Vector3 targetMovementVelocity = reorientedInput * maxStableMoveSpeed; var targetMovementVelocity = reorientedInput * maxStableMoveSpeed;
// Плавная интерполяция текущей скорости к целевой с экспоненциальным сглаживанием // Плавная интерполяция текущей скорости к целевой с экспоненциальным сглаживанием
currentVelocity = Vector3.Lerp( currentVelocity = Vector3.Lerp(
@@ -4,52 +4,113 @@ using Reflex.Attributes;
using UnityEngine; using UnityEngine;
using CharacterController = Code.Gameplay.Player.CharacterController; using CharacterController = Code.Gameplay.Player.CharacterController;
/*
* Главный скрипт игрока, объединяющий камеру и контроллер персонажа
* Обрабатывает ввод пользователя и распределяет его между компонентами
* Синхронизирует состояние камеры и персонажа
* Управляет переключением режимов камеры через Input System
*/
public class Player : MonoBehaviour public class Player : MonoBehaviour
{ {
[SerializeField] [SerializeField]
private PlayerCamera playerCamera; private PlayerCamera playerCamera; // Компонент камеры игрока
[SerializeField] [SerializeField]
private CharacterController characterController; private CharacterController characterController; // Компонент управления персонажем
[SerializeField] [SerializeField]
private Transform cameraFollowPoint; private Transform cameraFollowPoint; // Точка следования камеры (уровень глаз для FirstPerson)
[Inject] private IInputService _inputService;
private Vector3 _lookInputVector; [Inject]
private IInputService _inputService; // Сервис ввода через DI
// Флаг для отслеживания переключения режима камеры (чтобы избежать многократных срабатываний)
private bool _cameraModeToggleHandled;
// Инициализация игрока
private void Start() private void Start()
{ {
// Настройка камеры для следования за точкой камеры
playerCamera.SetFollowTransform(cameraFollowPoint); playerCamera.SetFollowTransform(cameraFollowPoint);
// Включение Gameplay мапа ввода
_inputService.EnableMap(ActionMappings.Gameplay);
} }
// Обработка ввода для камеры (вращение и зум)
private void HandleCameraInput() private void HandleCameraInput()
{ {
// Получаем данные ввода из Input System
var lookInput = _inputService.LookInput; var lookInput = _inputService.LookInput;
var scrollInput = _inputService.ZoomInput; var scrollInput = _inputService.ZoomInput;
// Передаем данные в камеру
playerCamera.UpdateWithInput(Time.deltaTime, scrollInput, playerCamera.UpdateWithInput(Time.deltaTime, scrollInput,
new Vector3(lookInput.x, lookInput.y, 0)); new Vector3(lookInput.x, lookInput.y, 0));
} }
// Обработка ввода для движения персонажа
private void HandleCharacterInput() private void HandleCharacterInput()
{ {
PlayerInputs inputs = new PlayerInputs(); // Создаем структуру ввода с полной информацией о камере
var inputs = new PlayerInputs();
Vector2 moveInput = _inputService.MoveInput; // Получаем данные движения из Input System
inputs.MoveAxisForward = moveInput.y; var moveInput = _inputService.MoveInput;
inputs.MoveAxisRight = moveInput.x; inputs.MoveAxisForward = moveInput.y; // Vertical ось (W/S или Up/Down)
inputs.MoveAxisRight = moveInput.x; // Horizontal ось (A/D или Left/Right)
// Передаем информацию о камере для адаптивного поведения
inputs.CameraRotation = playerCamera.transform.rotation; inputs.CameraRotation = playerCamera.transform.rotation;
inputs.CameraMode = playerCamera.CurrentMode;
inputs.CameraPlanarDirection = playerCamera.PlanarDirection;
// Передаем ввод в контроллер персонажа
characterController.SetInputs(ref inputs); 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() private void Update()
{ {
// Обработка ввода для движения в Update (физика)
HandleCharacterInput(); HandleCharacterInput();
// Обработка переключения режима камеры
HandleCameraModeInput();
} }
// Обновление после всех вычислений (идеально для камеры)
private void LateUpdate() private void LateUpdate()
{ {
// Обработка ввода для камеры в LateUpdate (после движения персонажа)
HandleCameraInput(); HandleCameraInput();
} }
} }
@@ -3,6 +3,21 @@ using UnityEngine;
namespace Code.Gameplay.Player namespace Code.Gameplay.Player
{ {
/*
* Перечисление режимов работы камеры
* Static - статичная камера без следования за целью
* FirstPerson - камера от первого лица (встроена в модель персонажа)
* ThirdPerson - камера от третьего лица (следует за персонажем на расстоянии)
* Cinematic - кинематографическая камера для скриптовых сцен
*/
public enum CameraMode
{
Static,
FirstPerson,
ThirdPerson,
Cinematic
}
/* /*
* Скрипт, отвечающий за поведение камеры при передвижении * Скрипт, отвечающий за поведение камеры при передвижении
* Поддерживает как 3rd-person, так и 1st-person режимы камеры * Поддерживает как 3rd-person, так и 1st-person режимы камеры
@@ -23,27 +38,29 @@ namespace Code.Gameplay.Player
distanceMovementSpeed = 5f, // Множитель скорости изменения дистанции при зуме distanceMovementSpeed = 5f, // Множитель скорости изменения дистанции при зуме
// Скорость интерполяции текущая -> целевая позиция зума // Скорость интерполяции текущая -> целевая позиция зума
distanceMovementSharpness = 10000f, // Коэффициент плавности изменения дистанции (чем выше - тем резче) distanceMovementSharpness = 100f, // Коэффициент плавности изменения дистанции (чем выше - тем резче)
// Скорость поворота камеры // Скорость поворота камеры
rotationSpeed = 1f, // Множитель скорости вращения камеры rotationSpeed = 0.3f, // Множитель скорости вращения камеры
// Скорость интерполяции текущее -> целевое вращение // Скорость интерполяции текущее -> целевое вращение
rotationSharpness = 10000f, // Коэффициент плавности вращения камеры (чем выше - тем резче) rotationSharpness = 100f, // Коэффициент плавности вращения камеры (чем выше - тем резче)
// Резкость следования камеры за целью // Резкость следования камеры за целью
followSharpness = 10000f, // Коэффициент плавности следования за движущейся целью (чем выше - тем резче) followSharpness = 100f, // Коэффициент плавности следования за движущейся целью (чем выше - тем резче)
// Углы наклона камеры // Углы наклона камеры
minVerticalAngle = -45f, // Минимальный угол наклона камеры (вниз) minVerticalAngle = -70f, // Минимальный угол наклона камеры (вниз)
maxVerticalAngle = 45f, // Максимальный угол наклона камеры (вверх) maxVerticalAngle = 70f, // Максимальный угол наклона камеры (вверх)
defaultVerticalAngle = 10f; // Стандартный угол наклона камеры defaultVerticalAngle = 10f; // Стандартный угол наклона камеры
// Текущий режим работы камеры
// Трансформ объекта, за которым следует камера (для 1st-person: уровень глаз) // Трансформ объекта, за которым следует камера (для 1st-person: уровень глаз)
private Transform _followTransform; private Transform _followTransform;
// Позиция следования: текущая сглаженная позиция и горизонтальное направление камеры // Позиция следования: текущая сглаженная позиция и горизонтальное направление камеры
private Vector3 _currentFollowPosition, _planarDirection; private Vector3 _currentFollowPosition;
// Целевой вертикальный угол камеры (наклон вверх/вниз) // Целевой вертикальный угол камеры (наклон вверх/вниз)
private float _targetVerticalAngle; private float _targetVerticalAngle;
@@ -51,13 +68,26 @@ namespace Code.Gameplay.Player
// Текущая и целевая дистанция камеры от цели // Текущая и целевая дистанция камеры от цели
private float _currentDistance, _targetDistance; private float _currentDistance, _targetDistance;
// Исходные значения дистанции для восстановления после FirstPerson режима
private float _originalDefaultDistance, _originalMinDistance, _originalMaxDistance;
// Свойства для доступа к важным данным камеры извне
public Vector3 PlanarDirection { get; private set; } // Горизонтальное направление камеры
public CameraMode CurrentMode { get; private set; } = CameraMode.ThirdPerson; // Текущий режим камеры
// Инициализация камеры при создании // Инициализация камеры при создании
private void Awake() private void Awake()
{ {
// Сохраняем исходные значения дистанции для восстановления
_originalDefaultDistance = defaultDistance;
_originalMinDistance = minDistance;
_originalMaxDistance = maxDistance;
_currentDistance = defaultDistance; _currentDistance = defaultDistance;
_targetDistance = _currentDistance; _targetDistance = _currentDistance;
_targetVerticalAngle = 0f; _targetVerticalAngle = 0f;
_planarDirection = Vector3.forward; // Начальное направление - вперед по оси Z PlanarDirection = Vector3.forward; // Начальное направление - вперед по оси Z
} }
// Установка цели для следования камеры // Установка цели для следования камеры
@@ -65,7 +95,7 @@ namespace Code.Gameplay.Player
{ {
_followTransform = t; _followTransform = t;
_currentFollowPosition = t.position; _currentFollowPosition = t.position;
_planarDirection = t.forward; // Начальное направление совпадает с направлением цели PlanarDirection = t.forward; // Начальное направление совпадает с направлением цели
} }
// Валидация параметров в редакторе Unity // Валидация параметров в редакторе Unity
@@ -81,8 +111,8 @@ namespace Code.Gameplay.Player
{ {
// Вращение вокруг вертикальной оси (горизонтальный поворот) // Вращение вокруг вертикальной оси (горизонтальный поворот)
var rotationFromInput = Quaternion.Euler(_followTransform.up * (rotationInput.x * rotationSpeed)); var rotationFromInput = Quaternion.Euler(_followTransform.up * (rotationInput.x * rotationSpeed));
_planarDirection = rotationFromInput * _planarDirection; PlanarDirection = rotationFromInput * PlanarDirection;
var planarRotation = Quaternion.LookRotation(_planarDirection, _followTransform.up); var planarRotation = Quaternion.LookRotation(PlanarDirection, _followTransform.up);
// Вращение вокруг горизонтальной оси (вертикальный наклон) // Вращение вокруг горизонтальной оси (вертикальный наклон)
_targetVerticalAngle -= rotationInput.y * rotationSpeed; _targetVerticalAngle -= rotationInput.y * rotationSpeed;
@@ -96,21 +126,38 @@ namespace Code.Gameplay.Player
transform.rotation = targetRotation; transform.rotation = targetRotation;
} }
// Обработка позиционирования камеры и зума // Обработка позиционирования камеры и зума с учетом текущего режима
private void HandlePosition(float deltaTime, float zoomInput, Quaternion targetRotation) private void HandlePosition(float deltaTime, float zoomInput, Quaternion targetRotation)
{ {
// Обновление целевой дистанции на основе ввода зума // В FirstPerson режиме зум отключается
_targetDistance += zoomInput * distanceMovementSpeed; if (CurrentMode != CameraMode.FirstPerson)
_targetDistance = Mathf.Clamp(_targetDistance, minDistance, maxDistance); {
// Обновление целевой дистанции на основе ввода зума
_targetDistance += zoomInput * distanceMovementSpeed;
_targetDistance = Mathf.Clamp(_targetDistance, minDistance, maxDistance);
}
// Плавное следование за целью с использованием экспоненциального сглаживания // Плавное следование за целью с использованием экспоненциального сглаживания
_currentFollowPosition = Vector3.Lerp(_currentFollowPosition, _followTransform.position, 1f - Mathf.Exp(-followSharpness * deltaTime)); _currentFollowPosition = Vector3.Lerp(_currentFollowPosition, _followTransform.position, 1f - Mathf.Exp(-followSharpness * deltaTime));
// Вычисление целевой позиции камеры за вычетом дистанции по направлению взгляда // Вычисление целевой позиции камеры с учетом текущего режима
var targetPosition = _currentFollowPosition - targetRotation * Vector3.forward * _currentDistance; Vector3 targetPosition;
if (CurrentMode == CameraMode.FirstPerson)
{
// В FirstPerson режиме камера находится прямо на позиции цели
targetPosition = _currentFollowPosition;
}
else
{
// В ThirdPerson режиме камера отодвинута на расстояние от цели
targetPosition = _currentFollowPosition - targetRotation * Vector3.forward * _currentDistance;
}
// Плавное изменение текущей дистанции к целевой // Плавное изменение текущей дистанции к целевой (только для ThirdPerson)
_currentDistance = Mathf.Lerp(_currentDistance, _targetDistance, 1f - Mathf.Exp(-distanceMovementSpeed * deltaTime)); if (CurrentMode != CameraMode.FirstPerson)
{
_currentDistance = Mathf.Lerp(_currentDistance, _targetDistance, 1f - Mathf.Exp(-distanceMovementSpeed * deltaTime));
}
// Установка финальной позиции камеры // Установка финальной позиции камеры
transform.position = targetPosition; transform.position = targetPosition;
@@ -121,8 +168,48 @@ namespace Code.Gameplay.Player
{ {
// Проверка наличия цели для следования // Проверка наличия цели для следования
if (!_followTransform) return; if (!_followTransform) return;
// Обработка ввода и позиционирования
HandleRotationInput(deltaTime, rotationInput, out Quaternion targetRotation); HandleRotationInput(deltaTime, rotationInput, out Quaternion targetRotation);
HandlePosition(deltaTime, zoomInput, targetRotation); HandlePosition(deltaTime, zoomInput, targetRotation);
} }
// Смена режима камеры
public void SetCameraMode(CameraMode newMode)
{
if (CurrentMode == newMode) return;
CurrentMode = newMode;
// Применяем настройки специфичные для режима
ApplyModeSpecificSettings();
}
// Применение настроек специфичных для текущего режима
private void ApplyModeSpecificSettings()
{
switch (CurrentMode)
{
case CameraMode.FirstPerson:
// В FirstPerson режиме дистанция всегда равна 0
minDistance = 0f;
maxDistance = 0f;
defaultDistance = 0f;
_targetDistance = 0f;
_currentDistance = 0f;
break;
case CameraMode.ThirdPerson:
// Восстанавливаем исходные значения дистанции
minDistance = _originalMinDistance;
maxDistance = _originalMaxDistance;
defaultDistance = _originalDefaultDistance;
_targetDistance = defaultDistance;
break;
// Заготовка на будущее (если понадобится)
case CameraMode.Static:
case CameraMode.Cinematic:
default:
break;
}
}
} }
} }
@@ -7,8 +7,14 @@ namespace Code.Input
void EnableMap(ActionMappings actionMap); void EnableMap(ActionMappings actionMap);
void DisableMap(ActionMappings actionMap); void DisableMap(ActionMappings actionMap);
// Для управления камерой
Vector2 LookInput { get; } Vector2 LookInput { get; }
float ZoomInput { get; } float ZoomInput { get; }
// Для управления движением персонажа
Vector2 MoveInput { get; } Vector2 MoveInput { get; }
// Для переключения режима камеры
bool ToggleCameraModePressed { get; }
} }
} }
@@ -1,5 +1,4 @@
using System; using System;
using Reflex.Attributes;
using UnityEngine; using UnityEngine;
using UnityEngine.InputSystem; using UnityEngine.InputSystem;
@@ -8,12 +7,12 @@ namespace Code.Input
public class InputService : IInputService, IDisposable public class InputService : IInputService, IDisposable
{ {
private InputActionAsset _inputActionAsset; private readonly InputActionAsset _inputActionAsset;
// Для работы с камерой
public Vector2 LookInput { get; private set; } public Vector2 LookInput { get; private set; }
public float ZoomInput { get; private set; } public float ZoomInput { get; private set; }
public Vector2 MoveInput { get; private set; } public Vector2 MoveInput { get; private set; }
public bool ToggleCameraModePressed { get; private set; }
public InputService(InputActionAsset inputActionAsset) public InputService(InputActionAsset inputActionAsset)
{ {
@@ -21,24 +20,49 @@ namespace Code.Input
SetupInputCallbacks(); SetupInputCallbacks();
} }
// Обработка всех карт ввода
private void SetupInputCallbacks() private void SetupInputCallbacks()
{ {
SetupGameplayInputCallbacks();
}
// Обработка геймплейной карты ввода
private void SetupGameplayInputCallbacks()
{
// Инициализация геймплейной карты ввода
var gameplayMap = _inputActionAsset.FindActionMap("Gameplay"); var gameplayMap = _inputActionAsset.FindActionMap("Gameplay");
// Обработка взгляда (камера)
var lookAction = gameplayMap.FindAction("Look"); var lookAction = gameplayMap.FindAction("Look");
lookAction.performed += OnLookPerformed; if (lookAction != null)
lookAction.canceled += OnLookCanceled; {
lookAction.performed += OnLookPerformed;
lookAction.canceled += OnLookCanceled;
}
// Обработка зума (камера)
var zoomAction = gameplayMap.FindAction("Zoom"); var zoomAction = gameplayMap.FindAction("Zoom");
zoomAction.performed += OnZoomPerformed; if (zoomAction != null)
zoomAction.canceled += OnZoomCanceled; {
zoomAction.performed += OnZoomPerformed;
zoomAction.canceled += OnZoomCanceled;
}
// Обработка движения (персонаж)
var moveAction = gameplayMap.FindAction("Move"); var moveAction = gameplayMap.FindAction("Move");
if (moveAction != null) if (moveAction != null)
{ {
moveAction.performed += OnMovePerformed; moveAction.performed += OnMovePerformed;
moveAction.canceled += OnMoveCanceled; moveAction.canceled += OnMoveCanceled;
} }
// Обработка переключения режима камеры
var toggleCameraModeAction = gameplayMap.FindAction("ToggleCameraMode");
if (toggleCameraModeAction != null)
{
toggleCameraModeAction.performed += OnToggleCameraModePerformed;
toggleCameraModeAction.canceled += OnToggleCameraModeCanceled;
}
} }
private void OnLookPerformed(InputAction.CallbackContext context) private void OnLookPerformed(InputAction.CallbackContext context)
@@ -70,6 +94,16 @@ namespace Code.Input
{ {
MoveInput = Vector2.zero; MoveInput = Vector2.zero;
} }
private void OnToggleCameraModePerformed(InputAction.CallbackContext context)
{
ToggleCameraModePressed = true;
}
private void OnToggleCameraModeCanceled(InputAction.CallbackContext context)
{
ToggleCameraModePressed = false;
}
public void EnableMap(ActionMappings actionMap) => _inputActionAsset.actionMaps[(int)actionMap].Enable(); public void EnableMap(ActionMappings actionMap) => _inputActionAsset.actionMaps[(int)actionMap].Enable();
public void DisableMap(ActionMappings actionMap) => _inputActionAsset.actionMaps[(int)actionMap].Disable(); public void DisableMap(ActionMappings actionMap) => _inputActionAsset.actionMaps[(int)actionMap].Disable();
@@ -86,10 +120,15 @@ namespace Code.Input
var gameplayMap = _inputActionAsset.FindActionMap("Gameplay"); var gameplayMap = _inputActionAsset.FindActionMap("Gameplay");
gameplayMap.FindAction("Look").performed -= OnLookPerformed; gameplayMap.FindAction("Look").performed -= OnLookPerformed;
gameplayMap.FindAction("Look").canceled -= OnLookCanceled; gameplayMap.FindAction("Look").canceled -= OnLookCanceled;
gameplayMap.FindAction("Zoom").performed -= OnZoomPerformed; gameplayMap.FindAction("Zoom").performed -= OnZoomPerformed;
gameplayMap.FindAction("Zoom").canceled -= OnZoomCanceled; gameplayMap.FindAction("Zoom").canceled -= OnZoomCanceled;
gameplayMap.FindAction("Move").performed -= OnMovePerformed; gameplayMap.FindAction("Move").performed -= OnMovePerformed;
gameplayMap.FindAction("Move").canceled -= OnMoveCanceled; gameplayMap.FindAction("Move").canceled -= OnMoveCanceled;
gameplayMap.FindAction("ToggleCameraMode").performed -= OnToggleCameraModePerformed;
gameplayMap.FindAction("ToggleCameraMode").canceled -= OnToggleCameraModeCanceled;
} }
} }
} }
@@ -20,7 +20,7 @@ Material:
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_Name: TestMaterial m_Name: GroundTestMaterial
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
m_Parent: {fileID: 0} m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0 m_ModifiedSerializedProperties: 0
@@ -0,0 +1,138 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &-8082666438668706547
MonoBehaviour:
m_ObjectHideFlags: 11
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
version: 10
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: WallsMateriall
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _DETAIL_MULX2
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap:
RenderType: Opaque
disabledShaderPasses:
- MOTIONVECTORS
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BaseMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 2800000, guid: 084980307d793717d9a5b1b4852db839, type: 3}
m_Scale: {x: 5, y: 5}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_Lightmaps:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_LightmapsInd:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_ShadowMasks:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _AddPrecomputedVelocity: 0
- _AlphaClip: 0
- _AlphaToMask: 0
- _Blend: 0
- _BlendModePreserveSpecular: 1
- _BumpScale: 1
- _ClearCoatMask: 0
- _ClearCoatSmoothness: 0
- _Cull: 2
- _Cutoff: 0.5
- _DetailAlbedoMapScale: 1
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _DstBlendAlpha: 0
- _EnvironmentReflections: 1
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 0
- _Metallic: 0
- _OcclusionStrength: 1
- _Parallax: 0.005
- _QueueOffset: 0
- _ReceiveShadows: 1
- _Smoothness: 0.5
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Surface: 0
- _WorkflowMode: 1
- _XRMotionVectorsPass: 1
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b407164ea2464a05a97202efff71afc6
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
@@ -358,20 +358,17 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: f1d98e6c5419411098391c07861e627e, type: 3} m_Script: {fileID: 11500000, guid: f1d98e6c5419411098391c07861e627e, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Code.Gameplay.Player.PlayerCamera m_EditorClassIdentifier: Assembly-CSharp::Code.Gameplay.Player.PlayerCamera
defaultDistance: 0 defaultDistance: 6
minDistance: 0 minDistance: 3
maxDistance: 10 maxDistance: 10
distanceMovementSpeed: 5 distanceMovementSpeed: 5
distanceMovementSharpness: 10000 distanceMovementSharpness: 100
rotationSpeed: 1 rotationSpeed: 0.3
rotationSharpness: 10000 rotationSharpness: 100
followSharpness: 10000 followSharpness: 100
minVerticalAngle: -45 minVerticalAngle: -70
maxVerticalAngle: 45 maxVerticalAngle: 70
defaultVerticalAngle: 10 defaultVerticalAngle: 10
minHorizontalAngle: -90
maxHorizontalAngle: 90
defaultHorizontalAngle: 0
--- !u!1 &453575297 --- !u!1 &453575297
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -547,6 +544,117 @@ Transform:
- {fileID: 1533098598} - {fileID: 1533098598}
m_Father: {fileID: 1696686254} m_Father: {fileID: 1696686254}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1376862591
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1376862595}
- component: {fileID: 1376862594}
- component: {fileID: 1376862593}
- component: {fileID: 1376862592}
m_Layer: 0
m_Name: Wall
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!65 &1376862592
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1376862591}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Size: {x: 1, y: 1, z: 1}
m_Center: {x: 0, y: 0, z: 0}
--- !u!23 &1376862593
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1376862591}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: b407164ea2464a05a97202efff71afc6, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!33 &1376862594
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1376862591}
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
--- !u!4 &1376862595
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1376862591}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -10, y: 3, z: 0}
m_LocalScale: {x: 2, y: 6, z: 10}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1533098597 --- !u!1 &1533098597
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -637,6 +745,117 @@ MeshFilter:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1533098597} m_GameObject: {fileID: 1533098597}
m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0}
--- !u!1 &1543748505
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1543748509}
- component: {fileID: 1543748508}
- component: {fileID: 1543748507}
- component: {fileID: 1543748506}
m_Layer: 0
m_Name: Cube
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!65 &1543748506
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1543748505}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Size: {x: 1, y: 1, z: 1}
m_Center: {x: 0, y: 0, z: 0}
--- !u!23 &1543748507
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1543748505}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: b407164ea2464a05a97202efff71afc6, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!33 &1543748508
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1543748505}
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
--- !u!4 &1543748509
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1543748505}
serializedVersion: 2
m_LocalRotation: {x: 0.38268343, y: 0, z: 0, w: 0.92387956}
m_LocalPosition: {x: 5, y: 0, z: -10}
m_LocalScale: {x: 5, y: 5, z: 5}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 45, y: 0, z: 0}
--- !u!1 &1696686253 --- !u!1 &1696686253
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -822,3 +1041,5 @@ SceneRoots:
- {fileID: 1959874991} - {fileID: 1959874991}
- {fileID: 1696686254} - {fileID: 1696686254}
- {fileID: 481156070} - {fileID: 481156070}
- {fileID: 1376862595}
- {fileID: 1543748509}
@@ -555,6 +555,15 @@
"interactions": "", "interactions": "",
"initialStateCheck": true "initialStateCheck": true
}, },
{
"name": "ToggleCameraMode",
"type": "Button",
"id": "53b8a816-6ab5-4c21-81e2-211187b50e95",
"expectedControlType": "",
"processors": "",
"interactions": "",
"initialStateCheck": false
},
{ {
"name": "Attack", "name": "Attack",
"type": "Button", "type": "Button",
@@ -769,7 +778,7 @@
"path": "<Pointer>/delta", "path": "<Pointer>/delta",
"interactions": "", "interactions": "",
"processors": "", "processors": "",
"groups": ";Keyboard&Mouse;Touch", "groups": ";Touch",
"action": "Look", "action": "Look",
"isComposite": false, "isComposite": false,
"isPartOfComposite": false "isPartOfComposite": false
@@ -791,7 +800,7 @@
"path": "<Mouse>/delta", "path": "<Mouse>/delta",
"interactions": "", "interactions": "",
"processors": "", "processors": "",
"groups": "", "groups": ";Keyboard&Mouse",
"action": "Look", "action": "Look",
"isComposite": false, "isComposite": false,
"isPartOfComposite": false "isPartOfComposite": false
@@ -1022,10 +1031,21 @@
"path": "<Mouse>/scroll/y", "path": "<Mouse>/scroll/y",
"interactions": "", "interactions": "",
"processors": "", "processors": "",
"groups": "", "groups": ";Keyboard&Mouse",
"action": "Zoom", "action": "Zoom",
"isComposite": false, "isComposite": false,
"isPartOfComposite": false "isPartOfComposite": false
},
{
"name": "",
"id": "2f4c687f-f66c-4cd8-93f5-28628df0b86f",
"path": "<Keyboard>/v",
"interactions": "",
"processors": "",
"groups": ";Keyboard&Mouse",
"action": "ToggleCameraMode",
"isComposite": false,
"isPartOfComposite": false
} }
] ]
} }