From 86c9c126a64a33f63c6a0e3719b0375986536cd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C5=A1a=20Ceviel?= <39222425+MrTorex@users.noreply.github.com> Date: Thu, 16 Oct 2025 22:06:27 +0300 Subject: [PATCH 1/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BA=D0=B0=D0=BC=D0=B5=D1=80=D0=B0,=20=D0=BE?= =?UTF-8?q?=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B8=D0=BD?= =?UTF-8?q?=D0=BF=D1=83=D1=82=20=D0=BC=D0=B0=D0=BF=D1=8B=20=D0=B8=20=D0=B5?= =?UTF-8?q?=D1=89=D1=91=20=D1=87=D1=83=D1=82=D1=8C-=D1=87=D1=83=D1=82?= =?UTF-8?q?=D1=8C=20=D1=88=D1=82=D1=83=D0=BA=20=D0=B4=D0=BB=D1=8F=20=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=B0=20(=D0=B2=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=BA=D1=80=D0=B8=D0=BD=D0=B6=D0=BE=D0=B2=D1=83?= =?UTF-8?q?=D1=8E=20=D1=81=D1=86=D0=B5=D0=BD=D1=83,=20=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D0=B9=D1=82=20=D0=BC=D0=B0=D1=88=D0=B8=D0=BD=D1=8B=20=D0=B8=20?= =?UTF-8?q?=D0=B4=D1=80.)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Code/App/AppStates/MovementDevState.cs | 38 + .../App/AppStates/MovementDevState.cs.meta | 3 + .../Assets/Code/App/BootstrapInstaller.cs | 6 +- .../Assets/Code/App/StateMachine/AppState.cs | 4 +- .../Code/App/StateMachine/AppStateMachine.cs | 3 + Game/CourierOld/Assets/Code/Gameplay.meta | 4 +- .../Assets/Code/Gameplay/Player.meta | 3 + .../Assets/Code/Gameplay/Player/Player.cs | 34 + .../Code/Gameplay/Player/Player.cs.meta | 2 + .../Code/Gameplay/Player/PlayerCamera.cs | 128 +++ .../Code/Gameplay/Player/PlayerCamera.cs.meta | 3 + .../Assets/Code/Input/GameplayActions.cs | 3 + .../Assets/Code/Input/IInputService.cs | 6 +- .../Assets/Code/Input/InputService.cs | 53 +- .../CourierOld/Assets/Code/Scenes/SceneIds.cs | 4 +- .../Assets/Resources/Scenes/MovementDev.unity | 736 ++++++++++++++++++ .../Resources/Scenes/MovementDev.unity.meta | 7 + .../Input/InputSystem_Actions.inputactions | 35 +- .../ProjectSettings/EditorBuildSettings.asset | 3 + .../ProjectSettings/ProjectSettings.asset | 3 + 20 files changed, 1062 insertions(+), 16 deletions(-) create mode 100644 Game/CourierOld/Assets/Code/App/AppStates/MovementDevState.cs create mode 100644 Game/CourierOld/Assets/Code/App/AppStates/MovementDevState.cs.meta create mode 100644 Game/CourierOld/Assets/Code/Gameplay/Player.meta create mode 100644 Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs create mode 100644 Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs.meta create mode 100644 Game/CourierOld/Assets/Code/Gameplay/Player/PlayerCamera.cs create mode 100644 Game/CourierOld/Assets/Code/Gameplay/Player/PlayerCamera.cs.meta create mode 100644 Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity create mode 100644 Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity.meta diff --git a/Game/CourierOld/Assets/Code/App/AppStates/MovementDevState.cs b/Game/CourierOld/Assets/Code/App/AppStates/MovementDevState.cs new file mode 100644 index 0000000..2fed0a9 --- /dev/null +++ b/Game/CourierOld/Assets/Code/App/AppStates/MovementDevState.cs @@ -0,0 +1,38 @@ +using Code.App.StateMachine; +using Code.Input; +using Code.Scenes; +using Code.StateMachine; + +namespace Code.App.AppStates +{ + //TODO: поменяно для теста + public class MovementDevState: BaseState + { + public MovementDevState(AppStateMachineContext context) : base(context) + { + } + + public override void EnterState() + { + Context.SceneLoaderService.LoadScene((int)SceneIds.MovementDev, SceneLoaded); + Context.InputService.EnableMap(ActionMappings.Gameplay); + } + + private void SceneLoaded() + { + + base.EnterState(); + } + + public override void Tick() + { + } + + public override void ExitState() + { + Context.InputService.DisableMap(ActionMappings.Gameplay); + + base.ExitState(); + } + } +} \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/App/AppStates/MovementDevState.cs.meta b/Game/CourierOld/Assets/Code/App/AppStates/MovementDevState.cs.meta new file mode 100644 index 0000000..701ac93 --- /dev/null +++ b/Game/CourierOld/Assets/Code/App/AppStates/MovementDevState.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 395d8d3979124f10897c28bae62b288a +timeCreated: 1760638654 \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/App/BootstrapInstaller.cs b/Game/CourierOld/Assets/Code/App/BootstrapInstaller.cs index 7f87fb0..cf3e584 100644 --- a/Game/CourierOld/Assets/Code/App/BootstrapInstaller.cs +++ b/Game/CourierOld/Assets/Code/App/BootstrapInstaller.cs @@ -51,10 +51,10 @@ namespace Code.App appStateMachine.Initialize(); AttributeInjector.Inject(appStateMachine.StateMachineContext, container); - + + // TODO: поменяно для теста appStateMachine - .SwitchState(AppState.MainMenu) - .AllowStateTransition(AppState.Gameplay); + .SwitchState(AppState.MovementDev); } } } \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/App/StateMachine/AppState.cs b/Game/CourierOld/Assets/Code/App/StateMachine/AppState.cs index 343ef3b..fdebce6 100644 --- a/Game/CourierOld/Assets/Code/App/StateMachine/AppState.cs +++ b/Game/CourierOld/Assets/Code/App/StateMachine/AppState.cs @@ -8,6 +8,8 @@ namespace Code.App.StateMachine Bootstrap = 1, MainMenu = 2, Gameplay = 4, - GameOver = 8 + GameOver = 8, + // TODO: поменяно для теста + MovementDev = 52 } } \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/App/StateMachine/AppStateMachine.cs b/Game/CourierOld/Assets/Code/App/StateMachine/AppStateMachine.cs index 566e990..8e29af7 100644 --- a/Game/CourierOld/Assets/Code/App/StateMachine/AppStateMachine.cs +++ b/Game/CourierOld/Assets/Code/App/StateMachine/AppStateMachine.cs @@ -10,9 +10,12 @@ namespace Code.App.StateMachine States.Add(AppState.MainMenu, new MainMenuState(StateMachineContext)); States.Add(AppState.Gameplay, new GameplayState(StateMachineContext)); States.Add(AppState.GameOver, new GameOverState(StateMachineContext)); + //TODO: Для теста + States.Add(AppState.MovementDev, new MovementDevState(StateMachineContext)); AllowedStates |= AppState.MainMenu; AllowedStates |= AppState.Gameplay; + AllowedStates |= AppState.MovementDev; } protected override bool CheckTransitionAllowed(AppState nextState) => AllowedStates.HasFlag(nextState); diff --git a/Game/CourierOld/Assets/Code/Gameplay.meta b/Game/CourierOld/Assets/Code/Gameplay.meta index 9420e3c..642bd06 100644 --- a/Game/CourierOld/Assets/Code/Gameplay.meta +++ b/Game/CourierOld/Assets/Code/Gameplay.meta @@ -1,3 +1,3 @@ fileFormatVersion: 2 -guid: a8d4b5b0fbd947b093f98937d7b80f8e -timeCreated: 1760423477 \ No newline at end of file +guid: e4901b413afd4d7da914edf2a1e51f8f +timeCreated: 1760627936 \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/Gameplay/Player.meta b/Game/CourierOld/Assets/Code/Gameplay/Player.meta new file mode 100644 index 0000000..a252be7 --- /dev/null +++ b/Game/CourierOld/Assets/Code/Gameplay/Player.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f8a8f6d0b8744b4c981d87722e6bb7e8 +timeCreated: 1760627963 \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs b/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs new file mode 100644 index 0000000..9f5e165 --- /dev/null +++ b/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs @@ -0,0 +1,34 @@ +using Code.Gameplay.Player; +using Code.Input; +using Reflex.Attributes; +using UnityEngine; + +public class Player : MonoBehaviour +{ + [SerializeField] + private PlayerCamera playerCamera; + [SerializeField] + private Transform cameraFollowPoint; + [Inject] private IInputService _inputService; + + private Vector3 _lookInputVector; + + private void Start() + { + playerCamera.SetFollowTransform(cameraFollowPoint); + } + + private void HandleCameraInput() + { + var lookInput = _inputService.LookInput; + var scrollInput = _inputService.ZoomInput; + + playerCamera.UpdateWithInput(Time.deltaTime, scrollInput, + new Vector3(lookInput.x, lookInput.y, 0)); + } + + private void LateUpdate() + { + HandleCameraInput(); + } +} diff --git a/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs.meta b/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs.meta new file mode 100644 index 0000000..3cd409c --- /dev/null +++ b/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9f2cdbe59523ace7ab0d8dfc36b4eb02 \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/Gameplay/Player/PlayerCamera.cs b/Game/CourierOld/Assets/Code/Gameplay/Player/PlayerCamera.cs new file mode 100644 index 0000000..736c4bb --- /dev/null +++ b/Game/CourierOld/Assets/Code/Gameplay/Player/PlayerCamera.cs @@ -0,0 +1,128 @@ +using System; +using UnityEngine; + +namespace Code.Gameplay.Player +{ + /* + * Скрипт, отвечающий за поведение камеры при передвижении + * Поддерживает как 3rd-person, так и 1st-person режимы камеры + * Реализует плавное следование за игроком, вращение и зум камеры + * + * Источник: Tvtig, https://www.youtube.com/watch?v=9ibpY64wBYM + */ + public class PlayerCamera : MonoBehaviour + { + [SerializeField] + private float + // Расстояния от игрока до камеры + defaultDistance = 6f, // Стандартное расстояние камеры от цели + minDistance = 3f, // Минимальное расстояние при зуме + maxDistance = 10f, // Максимальное расстояние при зуме + + // Скорость зума камеры + distanceMovementSpeed = 5f, // Множитель скорости изменения дистанции при зуме + + // Скорость интерполяции текущая -> целевая позиция зума + distanceMovementSharpness = 10000f, // Коэффициент плавности изменения дистанции (чем выше - тем резче) + + // Скорость поворота камеры + rotationSpeed = 1f, // Множитель скорости вращения камеры + + // Скорость интерполяции текущее -> целевое вращение + rotationSharpness = 10000f, // Коэффициент плавности вращения камеры (чем выше - тем резче) + + // Резкость следования камеры за целью + followSharpness = 10000f, // Коэффициент плавности следования за движущейся целью (чем выше - тем резче) + + // Углы наклона камеры + minVerticalAngle = -45f, // Минимальный угол наклона камеры (вниз) + maxVerticalAngle = 45f, // Максимальный угол наклона камеры (вверх) + defaultVerticalAngle = 10f; // Стандартный угол наклона камеры + + // Трансформ объекта, за которым следует камера (для 1st-person: уровень глаз) + private Transform _followTransform; + + // Позиция следования: текущая сглаженная позиция и горизонтальное направление камеры + private Vector3 _currentFollowPosition, _planarDirection; + + // Целевой вертикальный угол камеры (наклон вверх/вниз) + private float _targetVerticalAngle; + + // Текущая и целевая дистанция камеры от цели + private float _currentDistance, _targetDistance; + + // Инициализация камеры при создании + private void Awake() + { + _currentDistance = defaultDistance; + _targetDistance = _currentDistance; + _targetVerticalAngle = 0f; + _planarDirection = Vector3.forward; // Начальное направление - вперед по оси Z + } + + // Установка цели для следования камеры + public void SetFollowTransform(Transform t) + { + _followTransform = t; + _currentFollowPosition = t.position; + _planarDirection = t.forward; // Начальное направление совпадает с направлением цели + } + + // Валидация параметров в редакторе Unity + private void OnValidate() + { + // Обеспечиваем корректные значения дистанции и угла + defaultDistance = Mathf.Clamp(defaultDistance, minDistance, maxDistance); + defaultVerticalAngle = Mathf.Clamp(defaultVerticalAngle, minVerticalAngle, maxVerticalAngle); + } + + // Обработка вращения камеры на основе пользовательского ввода + private void HandleRotationInput(float deltaTime, Vector3 rotationInput, out Quaternion targetRotation) + { + // Вращение вокруг вертикальной оси (горизонтальный поворот) + var rotationFromInput = Quaternion.Euler(_followTransform.up * (rotationInput.x * rotationSpeed)); + _planarDirection = rotationFromInput * _planarDirection; + var planarRotation = Quaternion.LookRotation(_planarDirection, _followTransform.up); + + // Вращение вокруг горизонтальной оси (вертикальный наклон) + _targetVerticalAngle -= rotationInput.y * rotationSpeed; + _targetVerticalAngle = Math.Clamp(_targetVerticalAngle, minVerticalAngle, maxVerticalAngle); + var verticalRotation = Quaternion.Euler(_targetVerticalAngle, 0, 0); + + // Интерполяция к целевому вращению для плавности + targetRotation = Quaternion.Slerp(transform.rotation, planarRotation * verticalRotation, deltaTime * rotationSharpness); + + // Применение финального вращения + transform.rotation = targetRotation; + } + + // Обработка позиционирования камеры и зума + private void HandlePosition(float deltaTime, float zoomInput, Quaternion targetRotation) + { + // Обновление целевой дистанции на основе ввода зума + _targetDistance += zoomInput * distanceMovementSpeed; + _targetDistance = Mathf.Clamp(_targetDistance, minDistance, maxDistance); + + // Плавное следование за целью с использованием экспоненциального сглаживания + _currentFollowPosition = Vector3.Lerp(_currentFollowPosition, _followTransform.position, 1f - Mathf.Exp(-followSharpness * deltaTime)); + + // Вычисление целевой позиции камеры за вычетом дистанции по направлению взгляда + var targetPosition = _currentFollowPosition - targetRotation * Vector3.forward * _currentDistance; + + // Плавное изменение текущей дистанции к целевой + _currentDistance = Mathf.Lerp(_currentDistance, _targetDistance, 1f - Mathf.Exp(-distanceMovementSpeed * deltaTime)); + + // Установка финальной позиции камеры + transform.position = targetPosition; + } + + // Основной метод обновления камеры, вызываемый извне каждый кадр + public void UpdateWithInput(float deltaTime, float zoomInput, Vector3 rotationInput) + { + // Проверка наличия цели для следования + if (!_followTransform) return; + HandleRotationInput(deltaTime, rotationInput, out Quaternion targetRotation); + HandlePosition(deltaTime, zoomInput, targetRotation); + } + } +} \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/Gameplay/Player/PlayerCamera.cs.meta b/Game/CourierOld/Assets/Code/Gameplay/Player/PlayerCamera.cs.meta new file mode 100644 index 0000000..e57386e --- /dev/null +++ b/Game/CourierOld/Assets/Code/Gameplay/Player/PlayerCamera.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f1d98e6c5419411098391c07861e627e +timeCreated: 1760627986 \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/Input/GameplayActions.cs b/Game/CourierOld/Assets/Code/Input/GameplayActions.cs index cdbb3ed..9697340 100644 --- a/Game/CourierOld/Assets/Code/Input/GameplayActions.cs +++ b/Game/CourierOld/Assets/Code/Input/GameplayActions.cs @@ -2,5 +2,8 @@ namespace Code.Input { public enum GameplayActions { + Move, + Look, + Zoom } } \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/Input/IInputService.cs b/Game/CourierOld/Assets/Code/Input/IInputService.cs index 49f0e78..7ae3dc5 100644 --- a/Game/CourierOld/Assets/Code/Input/IInputService.cs +++ b/Game/CourierOld/Assets/Code/Input/IInputService.cs @@ -1,5 +1,4 @@ -using System; -using UnityEngine.InputSystem; +using UnityEngine; namespace Code.Input { @@ -7,5 +6,8 @@ namespace Code.Input { void EnableMap(ActionMappings actionMap); void DisableMap(ActionMappings actionMap); + + Vector2 LookInput { get; } + float ZoomInput { get; } } } \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/Input/InputService.cs b/Game/CourierOld/Assets/Code/Input/InputService.cs index 2589f22..1c59396 100644 --- a/Game/CourierOld/Assets/Code/Input/InputService.cs +++ b/Game/CourierOld/Assets/Code/Input/InputService.cs @@ -9,6 +9,49 @@ namespace Code.Input { private InputActionAsset _inputActionAsset; + + // Для работы с камерой + public Vector2 LookInput { get; private set; } + public float ZoomInput { get; private set; } + + public InputService(InputActionAsset inputActionAsset) + { + _inputActionAsset = inputActionAsset; + SetupInputCallbacks(); + } + + private void SetupInputCallbacks() + { + var gameplayMap = _inputActionAsset.FindActionMap("Gameplay"); + + var lookAction = gameplayMap.FindAction("Look"); + lookAction.performed += OnLookPerformed; + lookAction.canceled += OnLookCanceled; + + var zoomAction = gameplayMap.FindAction("Zoom"); + zoomAction.performed += OnZoomPerformed; + zoomAction.canceled += OnZoomCanceled; + } + + private void OnLookPerformed(InputAction.CallbackContext context) + { + LookInput = context.ReadValue(); + } + + private void OnLookCanceled(InputAction.CallbackContext context) + { + LookInput = Vector2.zero; + } + + private void OnZoomPerformed(InputAction.CallbackContext context) + { + ZoomInput = context.ReadValue(); + } + + private void OnZoomCanceled(InputAction.CallbackContext context) + { + ZoomInput = 0f; + } public void EnableMap(ActionMappings actionMap) => _inputActionAsset.actionMaps[(int)actionMap].Enable(); public void DisableMap(ActionMappings actionMap) => _inputActionAsset.actionMaps[(int)actionMap].Disable(); @@ -20,13 +63,13 @@ namespace Code.Input _inputActionAsset .actionMaps[mapId].actions[actionId].performed -= action; - public InputService(InputActionAsset inputActionAsset) - { - _inputActionAsset = inputActionAsset; - } - public void Dispose() { + var gameplayMap = _inputActionAsset.FindActionMap("Gameplay"); + gameplayMap.FindAction("Look").performed -= OnLookPerformed; + gameplayMap.FindAction("Look").canceled -= OnLookCanceled; + gameplayMap.FindAction("Zoom").performed -= OnZoomPerformed; + gameplayMap.FindAction("Zoom").canceled -= OnZoomCanceled; } } } \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/Scenes/SceneIds.cs b/Game/CourierOld/Assets/Code/Scenes/SceneIds.cs index ac3b0d9..e9c9a8d 100644 --- a/Game/CourierOld/Assets/Code/Scenes/SceneIds.cs +++ b/Game/CourierOld/Assets/Code/Scenes/SceneIds.cs @@ -4,6 +4,8 @@ namespace Code.Scenes { Initial, MainMenu, - Gameplay + Gameplay, + // TODO: поменяно для теста + MovementDev } } \ No newline at end of file diff --git a/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity b/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity new file mode 100644 index 0000000..9e9b820 --- /dev/null +++ b/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity @@ -0,0 +1,736 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 10 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &55880351 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 55880352} + - component: {fileID: 55880355} + - component: {fileID: 55880354} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &55880352 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 55880351} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.4, y: 0.4, z: 0} + m_LocalScale: {x: 0.5, y: 0.2, z: 0.4} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1533098598} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &55880354 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 55880351} + 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: 31321ba15b8f8eb4c954353edc038b1d, 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 &55880355 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 55880351} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &338454659 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 338454662} + - component: {fileID: 338454661} + - component: {fileID: 338454660} + - component: {fileID: 338454663} + - component: {fileID: 338454664} + m_Layer: 0 + m_Name: PlayerCamera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &338454660 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 338454659} + m_Enabled: 1 +--- !u!20 &338454661 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 338454659} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &338454662 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 338454659} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &338454663 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 338454659} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Runtime::UnityEngine.Rendering.Universal.UniversalAdditionalCameraData + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_VolumeFrameworkUpdateModeOption: 2 + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_AllowHDROutput: 1 + m_UseScreenCoordOverride: 0 + m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} + m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_TaaSettings: + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 1 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 + m_Version: 2 +--- !u!114 &338454664 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 338454659} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f1d98e6c5419411098391c07861e627e, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::Code.Gameplay.Player.PlayerCamera + defaultDistance: 6 + minDistance: 6 + maxDistance: 10 + distanceMovementSpeed: 5 + distanceMovementSharpness: 10000 + rotationSpeed: 1 + rotationSharpness: 10000 + followSharpness: 10000 + minVerticalAngle: -45 + maxVerticalAngle: 45 + defaultVerticalAngle: 10 +--- !u!1 &453575297 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 453575298} + m_Layer: 0 + m_Name: CameraTarget + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &453575298 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 453575297} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0.644, y: 1.395, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1696686254} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &481156066 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 481156070} + - component: {fileID: 481156069} + - component: {fileID: 481156068} + - component: {fileID: 481156067} + m_Layer: 0 + m_Name: Ground + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!64 &481156067 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 481156066} + 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: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &481156068 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 481156066} + 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: 31321ba15b8f8eb4c954353edc038b1d, 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 &481156069 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 481156066} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &481156070 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 481156066} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 100, y: 100, z: 100} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &678700801 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 678700802} + m_Layer: 0 + m_Name: Mesh + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &678700802 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678700801} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1533098598} + m_Father: {fileID: 1696686254} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1533098597 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1533098598} + - component: {fileID: 1533098600} + - component: {fileID: 1533098599} + m_Layer: 0 + m_Name: Capsule + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1533098598 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1533098597} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 55880352} + m_Father: {fileID: 678700802} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1533098599 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1533098597} + 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: 31321ba15b8f8eb4c954353edc038b1d, 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 &1533098600 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1533098597} + m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1696686253 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1696686254} + - component: {fileID: 1696686255} + m_Layer: 0 + m_Name: Player + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1696686254 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1696686253} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: -0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 678700802} + - {fileID: 453575298} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1696686255 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1696686253} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9f2cdbe59523ace7ab0d8dfc36b4eb02, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::Player + playerCamera: {fileID: 338454664} + cameraFollowPoint: {fileID: 453575298} +--- !u!1 &1959874989 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1959874991} + - component: {fileID: 1959874990} + m_Layer: 0 + m_Name: SceneScope + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1959874990 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1959874989} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3fd1482e4a9dee141aecc5bcd0a4f0f3, type: 3} + m_Name: + m_EditorClassIdentifier: Reflex::Reflex.Core.SceneScope +--- !u!4 &1959874991 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1959874989} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 338454662} + - {fileID: 1959874991} + - {fileID: 1696686254} + - {fileID: 481156070} diff --git a/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity.meta b/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity.meta new file mode 100644 index 0000000..731746d --- /dev/null +++ b/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: de5b9a1ae6b033560b88d00b149b86bd +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Game/CourierOld/Assets/Settings/Input/InputSystem_Actions.inputactions b/Game/CourierOld/Assets/Settings/Input/InputSystem_Actions.inputactions index 95c9647..0042ac9 100644 --- a/Game/CourierOld/Assets/Settings/Input/InputSystem_Actions.inputactions +++ b/Game/CourierOld/Assets/Settings/Input/InputSystem_Actions.inputactions @@ -546,11 +546,20 @@ "interactions": "", "initialStateCheck": true }, + { + "name": "Zoom", + "type": "Value", + "id": "6a7a1c09-c0f8-4ffe-94e0-3dc5e9e279d4", + "expectedControlType": "Axis", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, { "name": "Attack", "type": "Button", "id": "6c2ab1b8-8984-453a-af3d-a3c78ae1679a", - "expectedControlType": "Button", + "expectedControlType": "", "processors": "", "interactions": "", "initialStateCheck": false @@ -559,7 +568,7 @@ "name": "Interact", "type": "Button", "id": "852140f2-7766-474d-8707-702459ba45f3", - "expectedControlType": "Button", + "expectedControlType": "", "processors": "", "interactions": "Hold", "initialStateCheck": false @@ -776,6 +785,17 @@ "isComposite": false, "isPartOfComposite": false }, + { + "name": "", + "id": "f8ca1921-4be2-4067-8199-ffea9bcefeee", + "path": "/delta", + "interactions": "", + "processors": "", + "groups": "", + "action": "Look", + "isComposite": false, + "isPartOfComposite": false + }, { "name": "", "id": "143bb1cd-cc10-4eca-a2f0-a3664166fe91", @@ -995,6 +1015,17 @@ "action": "Crouch", "isComposite": false, "isPartOfComposite": false + }, + { + "name": "", + "id": "00080d14-7d66-4e81-9fe8-9c3c9a0bb647", + "path": "/scroll/y", + "interactions": "", + "processors": "", + "groups": "", + "action": "Zoom", + "isComposite": false, + "isPartOfComposite": false } ] } diff --git a/Game/CourierOld/ProjectSettings/EditorBuildSettings.asset b/Game/CourierOld/ProjectSettings/EditorBuildSettings.asset index 65b057f..05103b7 100644 --- a/Game/CourierOld/ProjectSettings/EditorBuildSettings.asset +++ b/Game/CourierOld/ProjectSettings/EditorBuildSettings.asset @@ -14,5 +14,8 @@ EditorBuildSettings: - enabled: 1 path: Assets/Resources/Scenes/Gameplay.unity guid: 59150559bf28464b5a553799889b9b80 + - enabled: 1 + path: Assets/Resources/Scenes/MovementDev.unity + guid: de5b9a1ae6b033560b88d00b149b86bd m_configObjects: {} m_UseUCBPForAssetBundles: 0 diff --git a/Game/CourierOld/ProjectSettings/ProjectSettings.asset b/Game/CourierOld/ProjectSettings/ProjectSettings.asset index 230ac23..5e1ea44 100644 --- a/Game/CourierOld/ProjectSettings/ProjectSettings.asset +++ b/Game/CourierOld/ProjectSettings/ProjectSettings.asset @@ -532,6 +532,9 @@ PlayerSettings: - m_BuildTarget: AndroidPlayer m_APIs: 150000000b000000 m_Automatic: 0 + - m_BuildTarget: LinuxStandaloneSupport + m_APIs: 1500000011000000 + m_Automatic: 0 m_BuildTargetVRSettings: [] m_DefaultShaderChunkSizeInMB: 16 m_DefaultShaderChunkCount: 0 From 8981457f2dd7c4eab6c1e9264f64a12406a99a81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C5=A1a=20Ceviel?= <39222425+MrTorex@users.noreply.github.com> Date: Thu, 16 Oct 2025 23:18:22 +0300 Subject: [PATCH 2/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=B1=D0=B0=D0=B7=D0=BE=D0=B2=D0=BE=D0=B5=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D1=89=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5,=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=BC=D0=B0=D1=82=D0=B5=D1=80=D0=B8=D0=B0=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets/AddressableAssetsData.meta | 8 + .../AddressableAssetSettings.asset | 115 +++++++++++++ .../AddressableAssetSettings.asset.meta | 8 + .../AssetGroupTemplates.meta | 8 + .../AssetGroupTemplates/Packed Assets.asset | 79 +++++++++ .../Packed Assets.asset.meta | 8 + .../AddressableAssetsData/AssetGroups.meta | 8 + .../AssetGroups/Default Local Group.asset | 23 +++ .../Default Local Group.asset.meta | 8 + .../AssetGroups/Schemas.meta | 8 + ... Local Group_BundledAssetGroupSchema.asset | 48 ++++++ ...l Group_BundledAssetGroupSchema.asset.meta | 8 + ...Local Group_ContentUpdateGroupSchema.asset | 16 ++ ... Group_ContentUpdateGroupSchema.asset.meta | 8 + .../AddressableAssetsData/DataBuilders.meta | 8 + .../DataBuilders/BuildScriptFastMode.asset | 20 +++ .../BuildScriptFastMode.asset.meta | 8 + .../DataBuilders/BuildScriptPackedMode.asset | 20 +++ .../BuildScriptPackedMode.asset.meta | 8 + .../BuildScriptPackedPlayMode.asset | 20 +++ .../BuildScriptPackedPlayMode.asset.meta | 8 + .../AddressableAssetsData/DefaultObject.asset | 15 ++ .../DefaultObject.asset.meta | 8 + .../Gameplay/Player/CharacterController.cs | 157 ++++++++++++++++++ .../Player/CharacterController.cs.meta | 3 + .../Assets/Code/Gameplay/Player/Player.cs | 21 +++ .../Assets/Code/Input/IInputService.cs | 1 + .../Assets/Code/Input/InputService.cs | 20 +++ .../Assets/Resources/Materials.meta | 8 + .../Resources/Materials/TestMaterial.mat | 138 +++++++++++++++ .../Resources/Materials/TestMaterial.mat.meta | 8 + .../Assets/Resources/Materials/testTex.png | 3 + .../Resources/Materials/testTex.png.meta | 130 +++++++++++++++ .../Assets/Resources/Scenes/MovementDev.unity | 98 ++++++++++- .../ProjectSettings/EditorBuildSettings.asset | 3 +- 35 files changed, 1052 insertions(+), 6 deletions(-) create mode 100644 Game/CourierOld/Assets/AddressableAssetsData.meta create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/AddressableAssetSettings.asset create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/AddressableAssetSettings.asset.meta create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/AssetGroupTemplates.meta create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset.meta create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/AssetGroups.meta create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Default Local Group.asset create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Default Local Group.asset.meta create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Schemas.meta create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_BundledAssetGroupSchema.asset create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_BundledAssetGroupSchema.asset.meta create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_ContentUpdateGroupSchema.asset create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_ContentUpdateGroupSchema.asset.meta create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/DataBuilders.meta create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset.meta create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset.meta create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset.meta create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/DefaultObject.asset create mode 100644 Game/CourierOld/Assets/AddressableAssetsData/DefaultObject.asset.meta create mode 100644 Game/CourierOld/Assets/Code/Gameplay/Player/CharacterController.cs create mode 100644 Game/CourierOld/Assets/Code/Gameplay/Player/CharacterController.cs.meta create mode 100644 Game/CourierOld/Assets/Resources/Materials.meta create mode 100644 Game/CourierOld/Assets/Resources/Materials/TestMaterial.mat create mode 100644 Game/CourierOld/Assets/Resources/Materials/TestMaterial.mat.meta create mode 100644 Game/CourierOld/Assets/Resources/Materials/testTex.png create mode 100644 Game/CourierOld/Assets/Resources/Materials/testTex.png.meta diff --git a/Game/CourierOld/Assets/AddressableAssetsData.meta b/Game/CourierOld/Assets/AddressableAssetsData.meta new file mode 100644 index 0000000..0d85403 --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 65cf716f111fb36a19123f807ecdce25 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Game/CourierOld/Assets/AddressableAssetsData/AddressableAssetSettings.asset b/Game/CourierOld/Assets/AddressableAssetsData/AddressableAssetSettings.asset new file mode 100644 index 0000000..d7dfc11 --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/AddressableAssetSettings.asset @@ -0,0 +1,115 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + 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: 468a46d0ae32c3544b7d98094e6448a9, type: 3} + m_Name: AddressableAssetSettings + m_EditorClassIdentifier: Unity.Addressables.Editor::UnityEditor.AddressableAssets.Settings.AddressableAssetSettings + m_DefaultGroup: d447fc60305c17a17bf20948ab295a45 + m_currentHash: + serializedVersion: 2 + Hash: 44f191e9f235d5420c20a51f93ead7da + m_OptimizeCatalogSize: 0 + m_BuildRemoteCatalog: 0 + m_CatalogRequestsTimeout: 0 + m_DisableCatalogUpdateOnStart: 0 + m_InternalIdNamingMode: 0 + m_InternalBundleIdMode: 1 + m_AssetLoadMode: 0 + m_BundledAssetProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider + m_AssetBundleProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider + m_IgnoreUnsupportedFilesInBuild: 0 + m_UniqueBundleIds: 0 + m_EnableJsonCatalog: 0 + m_NonRecursiveBuilding: 1 + m_AllowNestedBundleFolders: 0 + m_CCDEnabled: 0 + m_maxConcurrentWebRequests: 3 + m_UseUWRForLocalBundles: 0 + m_BundleTimeout: 0 + m_BundleRetryCount: 0 + m_BundleRedirectLimit: -1 + m_SharedBundleSettings: 0 + m_SharedBundleSettingsCustomGroupIndex: 0 + m_ContiguousBundles: 1 + m_StripUnityVersionFromBundleBuild: 0 + m_DisableVisibleSubAssetRepresentations: 0 + m_BuiltInBundleNaming: 0 + mBuiltInBundleCustomNaming: + m_MonoScriptBundleNaming: 0 + m_CheckForContentUpdateRestrictionsOption: 0 + m_MonoScriptBundleCustomNaming: + m_RemoteCatalogBuildPath: + m_Id: + m_RemoteCatalogLoadPath: + m_Id: + m_ContentStateBuildPathProfileVariableName: + m_CustomContentStateBuildPath: + m_ContentStateBuildPath: + m_BuildAddressablesWithPlayerBuild: 0 + m_overridePlayerVersion: '[UnityEditor.PlayerSettings.bundleVersion]' + m_GroupAssets: + - {fileID: 11400000, guid: 7c592a6445170e8379910601b962cb30, type: 2} + m_BuildSettings: + m_LogResourceManagerExceptions: 1 + m_BundleBuildPath: Temp/com.unity.addressables/AssetBundles + m_ProfileSettings: + m_Profiles: + - m_InheritedParent: + m_Id: 27da1d7d9f959ba49a362cf69a3fd39a + m_ProfileName: Default + m_Values: + - m_Id: 1c16dd3f2d89b2375b66c8f065c7a694 + m_Value: '[UnityEditor.EditorUserBuildSettings.activeBuildTarget]' + - m_Id: 3dfc1a15d30236e7a8856b2164e14280 + m_Value: '[UnityEngine.AddressableAssets.Addressables.BuildPath]/[BuildTarget]' + - m_Id: 6c794a757c731a0319b43709731ad88b + m_Value: '{UnityEngine.AddressableAssets.Addressables.RuntimePath}/[BuildTarget]' + - m_Id: 74b04ebc3f202c2f9b6f1e8fb0470bd2 + m_Value: 'ServerData/[BuildTarget]' + - m_Id: 9ccf5e6cc7ba2d421a1c573d8a7ebcd7 + m_Value: + m_ProfileEntryNames: + - m_Id: 1c16dd3f2d89b2375b66c8f065c7a694 + m_Name: BuildTarget + m_InlineUsage: 0 + - m_Id: 3dfc1a15d30236e7a8856b2164e14280 + m_Name: Local.BuildPath + m_InlineUsage: 0 + - m_Id: 6c794a757c731a0319b43709731ad88b + m_Name: Local.LoadPath + m_InlineUsage: 0 + - m_Id: 74b04ebc3f202c2f9b6f1e8fb0470bd2 + m_Name: Remote.BuildPath + m_InlineUsage: 0 + - m_Id: 9ccf5e6cc7ba2d421a1c573d8a7ebcd7 + m_Name: Remote.LoadPath + m_InlineUsage: 0 + m_ProfileVersion: 1 + m_LabelTable: + m_LabelNames: + - default + m_SchemaTemplates: [] + m_GroupTemplateObjects: + - {fileID: 11400000, guid: 14909e654d6c7bd958ff44091773bd40, type: 2} + m_InitializationObjects: [] + m_CertificateHandlerType: + m_AssemblyName: + m_ClassName: + m_ActivePlayerDataBuilderIndex: 2 + m_DataBuilders: + - {fileID: 11400000, guid: 1ac723026a19cb90d8d5dd77ce8c384b, type: 2} + - {fileID: 11400000, guid: e628a9e942e45e1ca94ad90d02e9acdf, type: 2} + - {fileID: 11400000, guid: 1d3143f4a67a990fc9532b22a020137d, type: 2} + m_ActiveProfileId: 27da1d7d9f959ba49a362cf69a3fd39a diff --git a/Game/CourierOld/Assets/AddressableAssetsData/AddressableAssetSettings.asset.meta b/Game/CourierOld/Assets/AddressableAssetsData/AddressableAssetSettings.asset.meta new file mode 100644 index 0000000..a4b74b8 --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/AddressableAssetSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2588e84eb64800d0781c574a37fa48d8 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Game/CourierOld/Assets/AddressableAssetsData/AssetGroupTemplates.meta b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroupTemplates.meta new file mode 100644 index 0000000..ca2d2cf --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroupTemplates.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1ac379942ee61a312a9830cb792d2871 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Game/CourierOld/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset new file mode 100644 index 0000000..600d3df --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset @@ -0,0 +1,79 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + 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: 1a3c5d64ac83548c09dd1678b9f6f1cd, type: 3} + m_Name: Packed Assets + m_EditorClassIdentifier: Unity.Addressables.Editor::UnityEditor.AddressableAssets.Settings.AddressableAssetGroupTemplate + m_SchemaObjects: + - {fileID: 8850813396489121111} + - {fileID: 3451013361182384685} + m_Description: Pack assets into asset bundles. + m_Settings: {fileID: 11400000, guid: 2588e84eb64800d0781c574a37fa48d8, type: 2} +--- !u!114 &3451013361182384685 +MonoBehaviour: + m_ObjectHideFlags: 1 + 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: 5834b5087d578d24c926ce20cd31e6d6, type: 3} + m_Name: ContentUpdateGroupSchema + m_EditorClassIdentifier: Unity.Addressables.Editor::UnityEditor.AddressableAssets.Settings.GroupSchemas.ContentUpdateGroupSchema + m_Group: {fileID: 0} + m_StaticContent: 0 +--- !u!114 &8850813396489121111 +MonoBehaviour: + m_ObjectHideFlags: 1 + 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: e5d17a21594effb4e9591490b009e7aa, type: 3} + m_Name: BundledAssetGroupSchema + m_EditorClassIdentifier: Unity.Addressables.Editor::UnityEditor.AddressableAssets.Settings.GroupSchemas.BundledAssetGroupSchema + m_Group: {fileID: 0} + m_InternalBundleIdMode: 1 + m_Compression: 1 + m_IncludeAddressInCatalog: 1 + m_IncludeGUIDInCatalog: 1 + m_IncludeLabelsInCatalog: 1 + m_InternalIdNamingMode: 0 + m_CacheClearBehavior: 0 + m_IncludeInBuild: 1 + m_BundledAssetProviderType: + m_AssemblyName: + m_ClassName: + m_StripDownloadOptions: 0 + m_ForceUniqueProvider: 0 + m_UseAssetBundleCache: 1 + m_UseAssetBundleCrc: 1 + m_UseAssetBundleCrcForCachedBundles: 1 + m_UseUWRForLocalBundles: 0 + m_Timeout: 0 + m_ChunkedTransfer: 0 + m_RedirectLimit: -1 + m_RetryCount: 0 + m_BuildPath: + m_Id: + m_LoadPath: + m_Id: + m_BundleMode: 0 + m_AssetBundleProviderType: + m_AssemblyName: + m_ClassName: + m_UseDefaultSchemaSettings: 0 + m_SelectedPathPairIndex: 0 + m_BundleNaming: 0 + m_AssetLoadMode: 0 diff --git a/Game/CourierOld/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset.meta b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset.meta new file mode 100644 index 0000000..968ef4f --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 14909e654d6c7bd958ff44091773bd40 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups.meta b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups.meta new file mode 100644 index 0000000..f781d8c --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a39981dbe6de5001397f5ca9a8a37e1a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Default Local Group.asset b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Default Local Group.asset new file mode 100644 index 0000000..fa5f732 --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Default Local Group.asset @@ -0,0 +1,23 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + 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: bbb281ee3bf0b054c82ac2347e9e782c, type: 3} + m_Name: Default Local Group + m_EditorClassIdentifier: Unity.Addressables.Editor::UnityEditor.AddressableAssets.Settings.AddressableAssetGroup + m_GroupName: Default Local Group + m_GUID: d447fc60305c17a17bf20948ab295a45 + m_SerializeEntries: [] + m_ReadOnly: 0 + m_Settings: {fileID: 11400000, guid: 2588e84eb64800d0781c574a37fa48d8, type: 2} + m_SchemaSet: + m_Schemas: + - {fileID: 11400000, guid: 75ffac7db08d9615c994048949431551, type: 2} + - {fileID: 11400000, guid: 6d6fed27b8c8a3eebb9bc5289b7a6956, type: 2} diff --git a/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Default Local Group.asset.meta b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Default Local Group.asset.meta new file mode 100644 index 0000000..d9c5b8c --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Default Local Group.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7c592a6445170e8379910601b962cb30 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Schemas.meta b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Schemas.meta new file mode 100644 index 0000000..cf73de3 --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Schemas.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 25c8e3b4ddb778a6d84ae525564a7ee1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_BundledAssetGroupSchema.asset b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_BundledAssetGroupSchema.asset new file mode 100644 index 0000000..99b4136 --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_BundledAssetGroupSchema.asset @@ -0,0 +1,48 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + 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: e5d17a21594effb4e9591490b009e7aa, type: 3} + m_Name: Default Local Group_BundledAssetGroupSchema + m_EditorClassIdentifier: Unity.Addressables.Editor::UnityEditor.AddressableAssets.Settings.GroupSchemas.BundledAssetGroupSchema + m_Group: {fileID: 11400000, guid: 7c592a6445170e8379910601b962cb30, type: 2} + m_InternalBundleIdMode: 1 + m_Compression: 1 + m_IncludeAddressInCatalog: 1 + m_IncludeGUIDInCatalog: 1 + m_IncludeLabelsInCatalog: 1 + m_InternalIdNamingMode: 0 + m_CacheClearBehavior: 0 + m_IncludeInBuild: 1 + m_BundledAssetProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider + m_StripDownloadOptions: 0 + m_ForceUniqueProvider: 0 + m_UseAssetBundleCache: 1 + m_UseAssetBundleCrc: 1 + m_UseAssetBundleCrcForCachedBundles: 1 + m_UseUWRForLocalBundles: 0 + m_Timeout: 0 + m_ChunkedTransfer: 0 + m_RedirectLimit: -1 + m_RetryCount: 0 + m_BuildPath: + m_Id: 3dfc1a15d30236e7a8856b2164e14280 + m_LoadPath: + m_Id: 6c794a757c731a0319b43709731ad88b + m_BundleMode: 0 + m_AssetBundleProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider + m_UseDefaultSchemaSettings: 0 + m_SelectedPathPairIndex: 0 + m_BundleNaming: 0 + m_AssetLoadMode: 0 diff --git a/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_BundledAssetGroupSchema.asset.meta b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_BundledAssetGroupSchema.asset.meta new file mode 100644 index 0000000..1d4804f --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_BundledAssetGroupSchema.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 75ffac7db08d9615c994048949431551 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_ContentUpdateGroupSchema.asset b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_ContentUpdateGroupSchema.asset new file mode 100644 index 0000000..5a84ccc --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_ContentUpdateGroupSchema.asset @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + 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: 5834b5087d578d24c926ce20cd31e6d6, type: 3} + m_Name: Default Local Group_ContentUpdateGroupSchema + m_EditorClassIdentifier: Unity.Addressables.Editor::UnityEditor.AddressableAssets.Settings.GroupSchemas.ContentUpdateGroupSchema + m_Group: {fileID: 11400000, guid: 7c592a6445170e8379910601b962cb30, type: 2} + m_StaticContent: 0 diff --git a/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_ContentUpdateGroupSchema.asset.meta b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_ContentUpdateGroupSchema.asset.meta new file mode 100644 index 0000000..c1161d3 --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_ContentUpdateGroupSchema.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6d6fed27b8c8a3eebb9bc5289b7a6956 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Game/CourierOld/Assets/AddressableAssetsData/DataBuilders.meta b/Game/CourierOld/Assets/AddressableAssetsData/DataBuilders.meta new file mode 100644 index 0000000..7cc19d7 --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/DataBuilders.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d870ba11c395ba2d6b17a441e8e68cef +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset b/Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset new file mode 100644 index 0000000..12ab1d2 --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + 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: 88d21199f5d473f4db36845f2318f180, type: 3} + m_Name: BuildScriptFastMode + m_EditorClassIdentifier: Unity.Addressables.Editor::UnityEditor.AddressableAssets.Build.DataBuilders.BuildScriptFastMode + instanceProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.InstanceProvider + sceneProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.SceneProvider diff --git a/Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset.meta b/Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset.meta new file mode 100644 index 0000000..eac595e --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1ac723026a19cb90d8d5dd77ce8c384b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset b/Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset new file mode 100644 index 0000000..d8c59fd --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + 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: 3e2e0ffa088c91d41a086d0b8cb16bdc, type: 3} + m_Name: BuildScriptPackedMode + m_EditorClassIdentifier: Unity.Addressables.Editor::UnityEditor.AddressableAssets.Build.DataBuilders.BuildScriptPackedMode + instanceProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.InstanceProvider + sceneProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.SceneProvider diff --git a/Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset.meta b/Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset.meta new file mode 100644 index 0000000..e352d27 --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1d3143f4a67a990fc9532b22a020137d +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset b/Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset new file mode 100644 index 0000000..d566c2c --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + 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: ad8c280d42ee0ed41a27db23b43dd2bf, type: 3} + m_Name: BuildScriptPackedPlayMode + m_EditorClassIdentifier: Unity.Addressables.Editor::UnityEditor.AddressableAssets.Build.DataBuilders.BuildScriptPackedPlayMode + instanceProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.InstanceProvider + sceneProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.SceneProvider diff --git a/Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset.meta b/Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset.meta new file mode 100644 index 0000000..43b66e8 --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e628a9e942e45e1ca94ad90d02e9acdf +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Game/CourierOld/Assets/AddressableAssetsData/DefaultObject.asset b/Game/CourierOld/Assets/AddressableAssetsData/DefaultObject.asset new file mode 100644 index 0000000..f1c27b6 --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/DefaultObject.asset @@ -0,0 +1,15 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + 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: 3a189bb168d8d90478a09ea08c2f3d72, type: 3} + m_Name: DefaultObject + m_EditorClassIdentifier: Unity.Addressables.Editor::UnityEditor.AddressableAssets.AddressableAssetSettingsDefaultObject + m_AddressableAssetSettingsGuid: 2588e84eb64800d0781c574a37fa48d8 diff --git a/Game/CourierOld/Assets/AddressableAssetsData/DefaultObject.asset.meta b/Game/CourierOld/Assets/AddressableAssetsData/DefaultObject.asset.meta new file mode 100644 index 0000000..836f704 --- /dev/null +++ b/Game/CourierOld/Assets/AddressableAssetsData/DefaultObject.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9338e51d1f2239ddbb8f2c6232a2b678 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Game/CourierOld/Assets/Code/Gameplay/Player/CharacterController.cs b/Game/CourierOld/Assets/Code/Gameplay/Player/CharacterController.cs new file mode 100644 index 0000000..cf58b89 --- /dev/null +++ b/Game/CourierOld/Assets/Code/Gameplay/Player/CharacterController.cs @@ -0,0 +1,157 @@ +using KinematicCharacterController; +using UnityEngine; + +namespace Code.Gameplay.Player +{ + /* + * Скрипт, отвечающий за передвижения игрока + * Реализует физическое движение персонажа с использованием Kinematic Character Controller + * Обрабатывает ввод пользователя, применяет движение и вращение с учетом поверхности + * + * Источник: 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 + { + [SerializeField] + private KinematicCharacterMotor motor; // Движок физического перемещения персонажа + + [SerializeField] + private float + maxStableMoveSpeed = 10f, // Максимальная скорость движения по устойчивой поверхности + stableMovementSharpness = 15f, // Резкость изменения скорости движения (чем выше - тем резче) + orientationSharpness = 10f; // Резкость изменения вращения персонажа (чем выше - тем резче) + + // Векторы движения и направления взгляда + private Vector3 _moveInputVector, _lookInputVector; + + // Инициализация контроллера + private void Start() + { + motor.CharacterController = this; // Регистрация этого контроллера в движке + } + + // Обработка и преобразование входных данных от игрока + public void SetInputs(ref PlayerInputs inputs) + { + // Нормализация вектора движения и ограничение его величины до 1 + Vector3 moveInputVector = + Vector3.ClampMagnitude(new Vector3(inputs.MoveAxisRight, 0, inputs.MoveAxisForward), 1f); + + // Получение направления камеры в горизонтальной плоскости (игнорируя наклон) + Vector3 cameraPlanarDirection = + Vector3.ProjectOnPlane(inputs.CameraRotation * Vector3.forward, motor.CharacterUp).normalized; + + // Резервный расчет направления, если основное направление параллельно вертикали + if (cameraPlanarDirection.sqrMagnitude == 0f) + { + cameraPlanarDirection = Vector3.ProjectOnPlane(inputs.CameraRotation * Vector3.up, motor.CharacterUp); + } + + // Создание вращения на основе направления камеры + Quaternion cameraPlanarRotation = Quaternion.LookRotation(cameraPlanarDirection, motor.CharacterUp); + + // Преобразование локального ввода в мировые координаты относительно камеры + _moveInputVector = cameraPlanarRotation * moveInputVector; + + // Направление взгляда совпадает с направлением движения (нормализованное) + _lookInputVector = _moveInputVector.normalized; + } + + // Обновление вращения персонажа на основе входных данных + public void UpdateRotation(ref Quaternion currentRotation, float deltaTime) + { + // Вращение применяется только если есть направление движения и разрешена резкость вращения + if (_lookInputVector.sqrMagnitude > 0 && orientationSharpness > 0) + { + // Плавная интерполяция текущего направления к целевому с экспоненциальным сглаживанием + Vector3 smoothedLookInputDirection = Vector3.Slerp( + motor.CharacterForward, + _lookInputVector, + 1f - Mathf.Exp(-orientationSharpness * deltaTime) + ).normalized; + + // Установка нового вращения смотря в сглаженном направлении + currentRotation = Quaternion.LookRotation(smoothedLookInputDirection, motor.CharacterUp); + } + } + + // Обновление скорости движения персонажа + public void UpdateVelocity(ref Vector3 currentVelocity, float deltaTime) + { + // Сохранение текущей величины скорости + float currentVelocityMagnitude = currentVelocity.magnitude; + + // Получение нормали поверхности для корректного движения по наклонным плоскостям + Vector3 effectiveGroundNormal = motor.GroundingStatus.GroundNormal; + + // Переориентация текущей скорости вдоль поверхности + currentVelocity = motor.GetDirectionTangentToSurface(currentVelocity, effectiveGroundNormal) * currentVelocityMagnitude; + + // Переориентация входного вектора движения вдоль поверхности + Vector3 inputRight = Vector3.Cross(_moveInputVector, motor.CharacterUp); + Vector3 reorientedInput = Vector3.Cross(effectiveGroundNormal, inputRight).normalized * _moveInputVector.magnitude; + + // Расчет целевой скорости движения с учетом ограничения максимальной скорости + Vector3 targetMovementVelocity = reorientedInput * maxStableMoveSpeed; + + // Плавная интерполяция текущей скорости к целевой с экспоненциальным сглаживанием + currentVelocity = Vector3.Lerp( + currentVelocity, + targetMovementVelocity, + 1f - Mathf.Exp(-stableMovementSharpness * deltaTime) + ); + } + + // Метод вызывается перед обновлением персонажа (можно использовать для подготовки) + public void BeforeCharacterUpdate(float deltaTime) + { + } + + // Метод вызывается после обработки столкновения с землей + public void PostGroundingUpdate(float deltaTime) + { + } + + // Метод вызывается после обновления персонажа (можно использовать для пост-обработки) + public void AfterCharacterUpdate(float deltaTime) + { + } + + // Проверка валидности коллайдера для обработки столкновений + public bool IsColliderValidForCollisions(Collider coll) + { + return true; // Все коллайдеры считаются валидными для столкновений + } + + // Обработка столкновения с землей (вызывается при приземлении) + public void OnGroundHit(Collider hitCollider, Vector3 hitNormal, Vector3 hitPoint, ref HitStabilityReport hitStabilityReport) + { + } + + // Обработка столкновения при движении (вызывается при ударе о препятствие) + public void OnMovementHit(Collider hitCollider, Vector3 hitNormal, Vector3 hitPoint, + ref HitStabilityReport hitStabilityReport) + { + } + + // Обработка отчета о стабильности столкновения + public void ProcessHitStabilityReport(Collider hitCollider, Vector3 hitNormal, Vector3 hitPoint, Vector3 atCharacterPosition, + Quaternion atCharacterRotation, ref HitStabilityReport hitStabilityReport) + { + } + + // Обработка дискретных столкновений (для триггеров и специальных коллайдеров) + public void OnDiscreteCollisionDetected(Collider hitCollider) + { + } + } +} \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/Gameplay/Player/CharacterController.cs.meta b/Game/CourierOld/Assets/Code/Gameplay/Player/CharacterController.cs.meta new file mode 100644 index 0000000..3358496 --- /dev/null +++ b/Game/CourierOld/Assets/Code/Gameplay/Player/CharacterController.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a6f74123648343c498c883d02909b499 +timeCreated: 1760641740 \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs b/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs index 9f5e165..f0a45c6 100644 --- a/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs +++ b/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs @@ -2,12 +2,15 @@ using Code.Gameplay.Player; using Code.Input; using Reflex.Attributes; using UnityEngine; +using CharacterController = Code.Gameplay.Player.CharacterController; public class Player : MonoBehaviour { [SerializeField] private PlayerCamera playerCamera; [SerializeField] + private CharacterController characterController; + [SerializeField] private Transform cameraFollowPoint; [Inject] private IInputService _inputService; @@ -27,6 +30,24 @@ public class Player : MonoBehaviour new Vector3(lookInput.x, lookInput.y, 0)); } + private void HandleCharacterInput() + { + PlayerInputs inputs = new PlayerInputs(); + + Vector2 moveInput = _inputService.MoveInput; + inputs.MoveAxisForward = moveInput.y; + inputs.MoveAxisRight = moveInput.x; + + inputs.CameraRotation = playerCamera.transform.rotation; + + characterController.SetInputs(ref inputs); + } + + private void Update() + { + HandleCharacterInput(); + } + private void LateUpdate() { HandleCameraInput(); diff --git a/Game/CourierOld/Assets/Code/Input/IInputService.cs b/Game/CourierOld/Assets/Code/Input/IInputService.cs index 7ae3dc5..6fcf9e8 100644 --- a/Game/CourierOld/Assets/Code/Input/IInputService.cs +++ b/Game/CourierOld/Assets/Code/Input/IInputService.cs @@ -9,5 +9,6 @@ namespace Code.Input Vector2 LookInput { get; } float ZoomInput { get; } + Vector2 MoveInput { get; } } } \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/Input/InputService.cs b/Game/CourierOld/Assets/Code/Input/InputService.cs index 1c59396..7b77428 100644 --- a/Game/CourierOld/Assets/Code/Input/InputService.cs +++ b/Game/CourierOld/Assets/Code/Input/InputService.cs @@ -13,6 +13,7 @@ namespace Code.Input // Для работы с камерой public Vector2 LookInput { get; private set; } public float ZoomInput { get; private set; } + public Vector2 MoveInput { get; private set; } public InputService(InputActionAsset inputActionAsset) { @@ -31,6 +32,13 @@ namespace Code.Input var zoomAction = gameplayMap.FindAction("Zoom"); zoomAction.performed += OnZoomPerformed; zoomAction.canceled += OnZoomCanceled; + + var moveAction = gameplayMap.FindAction("Move"); + if (moveAction != null) + { + moveAction.performed += OnMovePerformed; + moveAction.canceled += OnMoveCanceled; + } } private void OnLookPerformed(InputAction.CallbackContext context) @@ -52,6 +60,16 @@ namespace Code.Input { ZoomInput = 0f; } + + private void OnMovePerformed(InputAction.CallbackContext context) + { + MoveInput = context.ReadValue(); + } + + private void OnMoveCanceled(InputAction.CallbackContext context) + { + MoveInput = Vector2.zero; + } public void EnableMap(ActionMappings actionMap) => _inputActionAsset.actionMaps[(int)actionMap].Enable(); public void DisableMap(ActionMappings actionMap) => _inputActionAsset.actionMaps[(int)actionMap].Disable(); @@ -70,6 +88,8 @@ namespace Code.Input gameplayMap.FindAction("Look").canceled -= OnLookCanceled; gameplayMap.FindAction("Zoom").performed -= OnZoomPerformed; gameplayMap.FindAction("Zoom").canceled -= OnZoomCanceled; + gameplayMap.FindAction("Move").performed -= OnMovePerformed; + gameplayMap.FindAction("Move").canceled -= OnMoveCanceled; } } } \ No newline at end of file diff --git a/Game/CourierOld/Assets/Resources/Materials.meta b/Game/CourierOld/Assets/Resources/Materials.meta new file mode 100644 index 0000000..13bc665 --- /dev/null +++ b/Game/CourierOld/Assets/Resources/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b1c9dc62b0eb2cfba9161205c17e150a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Game/CourierOld/Assets/Resources/Materials/TestMaterial.mat b/Game/CourierOld/Assets/Resources/Materials/TestMaterial.mat new file mode 100644 index 0000000..c4d3026 --- /dev/null +++ b/Game/CourierOld/Assets/Resources/Materials/TestMaterial.mat @@ -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: TestMaterial + 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: 1000, y: 1000} + 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 diff --git a/Game/CourierOld/Assets/Resources/Materials/TestMaterial.mat.meta b/Game/CourierOld/Assets/Resources/Materials/TestMaterial.mat.meta new file mode 100644 index 0000000..d03a976 --- /dev/null +++ b/Game/CourierOld/Assets/Resources/Materials/TestMaterial.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 115fc1c80dafb04e0a00ffed85cfb715 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Game/CourierOld/Assets/Resources/Materials/testTex.png b/Game/CourierOld/Assets/Resources/Materials/testTex.png new file mode 100644 index 0000000..ab3e198 --- /dev/null +++ b/Game/CourierOld/Assets/Resources/Materials/testTex.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:83447c99ae25b571be27445b209c9cc5854344667d9a094d157edbb71675ebed +size 264 diff --git a/Game/CourierOld/Assets/Resources/Materials/testTex.png.meta b/Game/CourierOld/Assets/Resources/Materials/testTex.png.meta new file mode 100644 index 0000000..d30d98d --- /dev/null +++ b/Game/CourierOld/Assets/Resources/Materials/testTex.png.meta @@ -0,0 +1,130 @@ +fileFormatVersion: 2 +guid: 084980307d793717d9a5b1b4852db839 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity b/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity index 9e9b820..98149d0 100644 --- a/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity +++ b/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity @@ -146,7 +146,7 @@ Transform: m_GameObject: {fileID: 55880351} serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.4, y: 0.4, z: 0} + m_LocalPosition: {x: 0, y: 0.4, z: 0.4} m_LocalScale: {x: 0.5, y: 0.2, z: 0.4} m_ConstrainProportionsScale: 0 m_Children: [] @@ -358,8 +358,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: f1d98e6c5419411098391c07861e627e, type: 3} m_Name: m_EditorClassIdentifier: Assembly-CSharp::Code.Gameplay.Player.PlayerCamera - defaultDistance: 6 - minDistance: 6 + defaultDistance: 0 + minDistance: 0 maxDistance: 10 distanceMovementSpeed: 5 distanceMovementSharpness: 10000 @@ -369,6 +369,9 @@ MonoBehaviour: minVerticalAngle: -45 maxVerticalAngle: 45 defaultVerticalAngle: 10 + minHorizontalAngle: -90 + maxHorizontalAngle: 90 + defaultHorizontalAngle: 0 --- !u!1 &453575297 GameObject: m_ObjectHideFlags: 0 @@ -394,7 +397,7 @@ Transform: m_GameObject: {fileID: 453575297} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0.644, y: 1.395, z: 0} + m_LocalPosition: {x: -0, y: 1.395, z: 0.59} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -466,7 +469,7 @@ MeshRenderer: m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + - {fileID: 2100000, guid: 115fc1c80dafb04e0a00ffed85cfb715, type: 2} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -644,6 +647,9 @@ GameObject: m_Component: - component: {fileID: 1696686254} - component: {fileID: 1696686255} + - component: {fileID: 1696686257} + - component: {fileID: 1696686256} + - component: {fileID: 1696686258} m_Layer: 0 m_Name: Player m_TagString: Untagged @@ -681,7 +687,89 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::Player playerCamera: {fileID: 338454664} + characterController: {fileID: 1696686258} cameraFollowPoint: {fileID: 453575298} +--- !u!114 &1696686256 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1696686253} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4d1bc5515e3ab954e80599c538834774, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::KinematicCharacterController.KinematicCharacterMotor + Capsule: {fileID: 1696686257} + CapsuleRadius: 0.5 + CapsuleHeight: 2 + CapsuleYOffset: 1 + CapsulePhysicsMaterial: {fileID: 0} + GroundDetectionExtraDistance: 0 + MaxStableSlopeAngle: 60 + StableGroundLayers: + serializedVersion: 2 + m_Bits: 4294967295 + DiscreteCollisionEvents: 0 + StepHandling: 1 + MaxStepHeight: 0.5 + AllowSteppingWithoutStableGrounding: 0 + MinRequiredStepDepth: 0.1 + LedgeAndDenivelationHandling: 1 + MaxStableDistanceFromLedge: 0.5 + MaxVelocityForLedgeSnap: 0 + MaxStableDenivelationAngle: 180 + InteractiveRigidbodyHandling: 1 + RigidbodyInteractionType: 0 + SimulatedCharacterMass: 1 + PreserveAttachedRigidbodyMomentum: 1 + HasPlanarConstraint: 0 + PlanarConstraintAxis: {x: 0, y: 0, z: 1} + MaxMovementIterations: 5 + MaxDecollisionIterations: 1 + CheckMovementInitialOverlaps: 1 + KillVelocityWhenExceedMaxMovementIterations: 1 + KillRemainingMovementWhenExceedMaxMovementIterations: 1 +--- !u!136 &1696686257 +CapsuleCollider: + m_ObjectHideFlags: 8 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1696686253} + 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: 2 + m_Radius: 0.5 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0, y: 1, z: 0} +--- !u!114 &1696686258 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1696686253} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a6f74123648343c498c883d02909b499, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::Code.Gameplay.Player.CharacterController + motor: {fileID: 1696686256} + maxStableMoveSpeed: 10 + stableMovementSharpness: 15 + orientationSharpness: 10 --- !u!1 &1959874989 GameObject: m_ObjectHideFlags: 0 diff --git a/Game/CourierOld/ProjectSettings/EditorBuildSettings.asset b/Game/CourierOld/ProjectSettings/EditorBuildSettings.asset index 05103b7..a3e453e 100644 --- a/Game/CourierOld/ProjectSettings/EditorBuildSettings.asset +++ b/Game/CourierOld/ProjectSettings/EditorBuildSettings.asset @@ -17,5 +17,6 @@ EditorBuildSettings: - enabled: 1 path: Assets/Resources/Scenes/MovementDev.unity guid: de5b9a1ae6b033560b88d00b149b86bd - m_configObjects: {} + m_configObjects: + com.unity.addressableassets: {fileID: 11400000, guid: 9338e51d1f2239ddbb8f2c6232a2b678, type: 2} m_UseUCBPForAssetBundles: 0 From bd0cee77a65fe4375522e13af525fc88fd55f563 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C5=A1a=20Ceviel?= <39222425+MrTorex@users.noreply.github.com> Date: Fri, 17 Oct 2025 12:07:48 +0300 Subject: [PATCH 3/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=BD=D0=BE=D1=80=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=BE=D0=B5=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=B5=D0=B6=D0=B4=D1=83=20Fir?= =?UTF-8?q?stPerson=20=D0=B8=20ThirdPerson=20=D0=BA=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=D0=BC=D0=B8,=20=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20FirstPerson=20?= =?UTF-8?q?=D0=BA=D0=B0=D0=BC=D0=B5=D1=80=D1=8B=20(=D0=B8=D0=B3=D1=80?= =?UTF-8?q?=D0=BE=D0=BA=20=D0=BF=D0=BE=D0=B2=D0=BE=D1=80=D0=B0=D1=87=D0=B8?= =?UTF-8?q?=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=B2=D0=BC=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=B5=20=D1=81=20=D0=BD=D0=B5=D0=B9),=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B7=D0=B0=D0=B3?= =?UTF-8?q?=D0=BE=D1=82=D0=BE=D0=B2=D0=BA=D0=B8=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=B4=D1=80=D1=83=D0=B3=D0=B8=D1=85=20=D0=BA=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=80,=20=D1=81=D1=82=D0=B0=D0=B1=D0=B8=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D1=8B=20=D0=BD=D0=B0=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B8=20=D0=BA=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=80=D1=8B.=20=D0=9F=D0=B5=D1=80=D0=B5=D1=85=D0=BE=D0=B6?= =?UTF-8?q?=D1=83=20=D0=BA=20=D0=B4=D0=B2=D0=B8=D0=B6=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Gameplay/Player/CharacterController.cs | 161 +++++++++--- .../Assets/Code/Gameplay/Player/Player.cs | 85 +++++- .../Code/Gameplay/Player/PlayerCamera.cs | 125 +++++++-- .../Assets/Code/Input/IInputService.cs | 6 + .../Assets/Code/Input/InputService.cs | 53 +++- ...estMaterial.mat => GroundTestMaterial.mat} | 2 +- ...l.mat.meta => GroundTestMaterial.mat.meta} | 0 .../Resources/Materials/WallsMateriall.mat | 138 ++++++++++ .../Materials/WallsMateriall.mat.meta | 8 + .../Assets/Resources/Scenes/MovementDev.unity | 243 +++++++++++++++++- .../Input/InputSystem_Actions.inputactions | 26 +- 11 files changed, 760 insertions(+), 87 deletions(-) rename Game/CourierOld/Assets/Resources/Materials/{TestMaterial.mat => GroundTestMaterial.mat} (99%) rename Game/CourierOld/Assets/Resources/Materials/{TestMaterial.mat.meta => GroundTestMaterial.mat.meta} (100%) create mode 100644 Game/CourierOld/Assets/Resources/Materials/WallsMateriall.mat create mode 100644 Game/CourierOld/Assets/Resources/Materials/WallsMateriall.mat.meta diff --git a/Game/CourierOld/Assets/Code/Gameplay/Player/CharacterController.cs b/Game/CourierOld/Assets/Code/Gameplay/Player/CharacterController.cs index cf58b89..5c1b3ca 100644 --- a/Game/CourierOld/Assets/Code/Gameplay/Player/CharacterController.cs +++ b/Game/CourierOld/Assets/Code/Gameplay/Player/CharacterController.cs @@ -3,22 +3,26 @@ using UnityEngine; 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 * Обрабатывает ввод пользователя, применяет движение и вращение с учетом поверхности * * Источник: 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 { [SerializeField] @@ -33,54 +37,143 @@ namespace Code.Gameplay.Player // Векторы движения и направления взгляда private Vector3 _moveInputVector, _lookInputVector; + // Текущий режим камеры для адаптации поведения + private CameraMode _currentCameraMode = CameraMode.ThirdPerson; + + // Вращение камеры в FirstPerson режиме для синхронизации (только горизонтальная компонента) + private Quaternion _firstPersonCameraRotation; + + // Флаг указывающий, что нужно применить вращение камеры к персонажу + private bool _shouldApplyCameraRotation; + // Инициализация контроллера private void Start() { motor.CharacterController = this; // Регистрация этого контроллера в движке + _firstPersonCameraRotation = motor.Transform.rotation; // Начальное вращение совпадает с персонажем } // Обработка и преобразование входных данных от игрока public void SetInputs(ref PlayerInputs inputs) { + // Сохраняем текущий режим камеры + _currentCameraMode = inputs.CameraMode; + // Нормализация вектора движения и ограничение его величины до 1 - Vector3 moveInputVector = + var moveInputVector = 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 = - Vector3.ProjectOnPlane(inputs.CameraRotation * Vector3.forward, motor.CharacterUp).normalized; + var cameraPlanarDirection = inputs.CameraPlanarDirection; // Резервный расчет направления, если основное направление параллельно вертикали if (cameraPlanarDirection.sqrMagnitude == 0f) { 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; - + // Направление взгляда совпадает с направлением движения (нормализованное) _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) { - // Вращение применяется только если есть направление движения и разрешена резкость вращения - if (_lookInputVector.sqrMagnitude > 0 && orientationSharpness > 0) + switch (_currentCameraMode) { - // Плавная интерполяция текущего направления к целевому с экспоненциальным сглаживанием - Vector3 smoothedLookInputDirection = Vector3.Slerp( - motor.CharacterForward, - _lookInputVector, - 1f - Mathf.Exp(-orientationSharpness * deltaTime) - ).normalized; - - // Установка нового вращения смотря в сглаженном направлении - currentRotation = Quaternion.LookRotation(smoothedLookInputDirection, motor.CharacterUp); + // В FirstPerson режиме применяем вращение камеры напрямую к персонажу (только горизонталь) + case CameraMode.FirstPerson when _shouldApplyCameraRotation: + // Немедленно применяем горизонтальное вращение камеры к персонажу + currentRotation = _firstPersonCameraRotation; + _shouldApplyCameraRotation = false; + break; + // В ThirdPerson режиме плавно поворачиваем персонаж в направлении движения + case CameraMode.ThirdPerson: + { + // Вращение применяется только если есть направление движения и разрешена резкость вращения + 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) { // Сохранение текущей величины скорости - float currentVelocityMagnitude = currentVelocity.magnitude; + var currentVelocityMagnitude = currentVelocity.magnitude; // Получение нормали поверхности для корректного движения по наклонным плоскостям - Vector3 effectiveGroundNormal = motor.GroundingStatus.GroundNormal; + var effectiveGroundNormal = motor.GroundingStatus.GroundNormal; // Переориентация текущей скорости вдоль поверхности currentVelocity = motor.GetDirectionTangentToSurface(currentVelocity, effectiveGroundNormal) * currentVelocityMagnitude; // Переориентация входного вектора движения вдоль поверхности - Vector3 inputRight = Vector3.Cross(_moveInputVector, motor.CharacterUp); - Vector3 reorientedInput = Vector3.Cross(effectiveGroundNormal, inputRight).normalized * _moveInputVector.magnitude; + var inputRight = Vector3.Cross(_moveInputVector, motor.CharacterUp); + var reorientedInput = Vector3.Cross(effectiveGroundNormal, inputRight).normalized * _moveInputVector.magnitude; // Расчет целевой скорости движения с учетом ограничения максимальной скорости - Vector3 targetMovementVelocity = reorientedInput * maxStableMoveSpeed; + var targetMovementVelocity = reorientedInput * maxStableMoveSpeed; // Плавная интерполяция текущей скорости к целевой с экспоненциальным сглаживанием currentVelocity = Vector3.Lerp( diff --git a/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs b/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs index f0a45c6..c135e8b 100644 --- a/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs +++ b/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs @@ -4,52 +4,113 @@ using Reflex.Attributes; using UnityEngine; using CharacterController = Code.Gameplay.Player.CharacterController; +/* + * Главный скрипт игрока, объединяющий камеру и контроллер персонажа + * Обрабатывает ввод пользователя и распределяет его между компонентами + * Синхронизирует состояние камеры и персонажа + * Управляет переключением режимов камеры через Input System + */ public class Player : MonoBehaviour { [SerializeField] - private PlayerCamera playerCamera; + private PlayerCamera playerCamera; // Компонент камеры игрока [SerializeField] - private CharacterController characterController; + private CharacterController characterController; // Компонент управления персонажем [SerializeField] - private Transform cameraFollowPoint; - [Inject] private IInputService _inputService; + private Transform cameraFollowPoint; // Точка следования камеры (уровень глаз для FirstPerson) - private Vector3 _lookInputVector; + [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() { - PlayerInputs inputs = new PlayerInputs(); + // Создаем структуру ввода с полной информацией о камере + var inputs = new PlayerInputs(); - Vector2 moveInput = _inputService.MoveInput; - inputs.MoveAxisForward = moveInput.y; - inputs.MoveAxisRight = moveInput.x; + // Получаем данные движения из 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(); } } diff --git a/Game/CourierOld/Assets/Code/Gameplay/Player/PlayerCamera.cs b/Game/CourierOld/Assets/Code/Gameplay/Player/PlayerCamera.cs index 736c4bb..bbee991 100644 --- a/Game/CourierOld/Assets/Code/Gameplay/Player/PlayerCamera.cs +++ b/Game/CourierOld/Assets/Code/Gameplay/Player/PlayerCamera.cs @@ -3,6 +3,21 @@ using UnityEngine; namespace Code.Gameplay.Player { + /* + * Перечисление режимов работы камеры + * Static - статичная камера без следования за целью + * FirstPerson - камера от первого лица (встроена в модель персонажа) + * ThirdPerson - камера от третьего лица (следует за персонажем на расстоянии) + * Cinematic - кинематографическая камера для скриптовых сцен + */ + public enum CameraMode + { + Static, + FirstPerson, + ThirdPerson, + Cinematic + } + /* * Скрипт, отвечающий за поведение камеры при передвижении * Поддерживает как 3rd-person, так и 1st-person режимы камеры @@ -23,27 +38,29 @@ namespace Code.Gameplay.Player distanceMovementSpeed = 5f, // Множитель скорости изменения дистанции при зуме // Скорость интерполяции текущая -> целевая позиция зума - distanceMovementSharpness = 10000f, // Коэффициент плавности изменения дистанции (чем выше - тем резче) + distanceMovementSharpness = 100f, // Коэффициент плавности изменения дистанции (чем выше - тем резче) // Скорость поворота камеры - rotationSpeed = 1f, // Множитель скорости вращения камеры + rotationSpeed = 0.3f, // Множитель скорости вращения камеры // Скорость интерполяции текущее -> целевое вращение - rotationSharpness = 10000f, // Коэффициент плавности вращения камеры (чем выше - тем резче) + rotationSharpness = 100f, // Коэффициент плавности вращения камеры (чем выше - тем резче) // Резкость следования камеры за целью - followSharpness = 10000f, // Коэффициент плавности следования за движущейся целью (чем выше - тем резче) + followSharpness = 100f, // Коэффициент плавности следования за движущейся целью (чем выше - тем резче) // Углы наклона камеры - minVerticalAngle = -45f, // Минимальный угол наклона камеры (вниз) - maxVerticalAngle = 45f, // Максимальный угол наклона камеры (вверх) + minVerticalAngle = -70f, // Минимальный угол наклона камеры (вниз) + maxVerticalAngle = 70f, // Максимальный угол наклона камеры (вверх) defaultVerticalAngle = 10f; // Стандартный угол наклона камеры + // Текущий режим работы камеры + // Трансформ объекта, за которым следует камера (для 1st-person: уровень глаз) private Transform _followTransform; // Позиция следования: текущая сглаженная позиция и горизонтальное направление камеры - private Vector3 _currentFollowPosition, _planarDirection; + private Vector3 _currentFollowPosition; // Целевой вертикальный угол камеры (наклон вверх/вниз) private float _targetVerticalAngle; @@ -51,13 +68,26 @@ namespace Code.Gameplay.Player // Текущая и целевая дистанция камеры от цели 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() { + // Сохраняем исходные значения дистанции для восстановления + _originalDefaultDistance = defaultDistance; + _originalMinDistance = minDistance; + _originalMaxDistance = maxDistance; + _currentDistance = defaultDistance; _targetDistance = _currentDistance; _targetVerticalAngle = 0f; - _planarDirection = Vector3.forward; // Начальное направление - вперед по оси Z + PlanarDirection = Vector3.forward; // Начальное направление - вперед по оси Z } // Установка цели для следования камеры @@ -65,7 +95,7 @@ namespace Code.Gameplay.Player { _followTransform = t; _currentFollowPosition = t.position; - _planarDirection = t.forward; // Начальное направление совпадает с направлением цели + PlanarDirection = t.forward; // Начальное направление совпадает с направлением цели } // Валидация параметров в редакторе Unity @@ -81,8 +111,8 @@ namespace Code.Gameplay.Player { // Вращение вокруг вертикальной оси (горизонтальный поворот) var rotationFromInput = Quaternion.Euler(_followTransform.up * (rotationInput.x * rotationSpeed)); - _planarDirection = rotationFromInput * _planarDirection; - var planarRotation = Quaternion.LookRotation(_planarDirection, _followTransform.up); + PlanarDirection = rotationFromInput * PlanarDirection; + var planarRotation = Quaternion.LookRotation(PlanarDirection, _followTransform.up); // Вращение вокруг горизонтальной оси (вертикальный наклон) _targetVerticalAngle -= rotationInput.y * rotationSpeed; @@ -96,21 +126,38 @@ namespace Code.Gameplay.Player transform.rotation = targetRotation; } - // Обработка позиционирования камеры и зума + // Обработка позиционирования камеры и зума с учетом текущего режима private void HandlePosition(float deltaTime, float zoomInput, Quaternion targetRotation) { - // Обновление целевой дистанции на основе ввода зума - _targetDistance += zoomInput * distanceMovementSpeed; - _targetDistance = Mathf.Clamp(_targetDistance, minDistance, maxDistance); + // В FirstPerson режиме зум отключается + if (CurrentMode != CameraMode.FirstPerson) + { + // Обновление целевой дистанции на основе ввода зума + _targetDistance += zoomInput * distanceMovementSpeed; + _targetDistance = Mathf.Clamp(_targetDistance, minDistance, maxDistance); + } // Плавное следование за целью с использованием экспоненциального сглаживания _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; + } - // Плавное изменение текущей дистанции к целевой - _currentDistance = Mathf.Lerp(_currentDistance, _targetDistance, 1f - Mathf.Exp(-distanceMovementSpeed * deltaTime)); + // Плавное изменение текущей дистанции к целевой (только для ThirdPerson) + if (CurrentMode != CameraMode.FirstPerson) + { + _currentDistance = Mathf.Lerp(_currentDistance, _targetDistance, 1f - Mathf.Exp(-distanceMovementSpeed * deltaTime)); + } // Установка финальной позиции камеры transform.position = targetPosition; @@ -121,8 +168,48 @@ namespace Code.Gameplay.Player { // Проверка наличия цели для следования if (!_followTransform) return; + + // Обработка ввода и позиционирования HandleRotationInput(deltaTime, rotationInput, out Quaternion 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; + } + } } } \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/Input/IInputService.cs b/Game/CourierOld/Assets/Code/Input/IInputService.cs index 6fcf9e8..9a27af8 100644 --- a/Game/CourierOld/Assets/Code/Input/IInputService.cs +++ b/Game/CourierOld/Assets/Code/Input/IInputService.cs @@ -7,8 +7,14 @@ namespace Code.Input void EnableMap(ActionMappings actionMap); void DisableMap(ActionMappings actionMap); + // Для управления камерой Vector2 LookInput { get; } float ZoomInput { get; } + + // Для управления движением персонажа Vector2 MoveInput { get; } + + // Для переключения режима камеры + bool ToggleCameraModePressed { get; } } } \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/Input/InputService.cs b/Game/CourierOld/Assets/Code/Input/InputService.cs index 7b77428..9c5509f 100644 --- a/Game/CourierOld/Assets/Code/Input/InputService.cs +++ b/Game/CourierOld/Assets/Code/Input/InputService.cs @@ -1,5 +1,4 @@ using System; -using Reflex.Attributes; using UnityEngine; using UnityEngine.InputSystem; @@ -8,12 +7,12 @@ namespace Code.Input public class InputService : IInputService, IDisposable { - private InputActionAsset _inputActionAsset; + private readonly InputActionAsset _inputActionAsset; - // Для работы с камерой public Vector2 LookInput { get; private set; } public float ZoomInput { get; private set; } public Vector2 MoveInput { get; private set; } + public bool ToggleCameraModePressed { get; private set; } public InputService(InputActionAsset inputActionAsset) { @@ -21,24 +20,49 @@ namespace Code.Input SetupInputCallbacks(); } + // Обработка всех карт ввода private void SetupInputCallbacks() { + SetupGameplayInputCallbacks(); + } + + // Обработка геймплейной карты ввода + private void SetupGameplayInputCallbacks() + { + // Инициализация геймплейной карты ввода var gameplayMap = _inputActionAsset.FindActionMap("Gameplay"); + // Обработка взгляда (камера) var lookAction = gameplayMap.FindAction("Look"); - lookAction.performed += OnLookPerformed; - lookAction.canceled += OnLookCanceled; + if (lookAction != null) + { + lookAction.performed += OnLookPerformed; + lookAction.canceled += OnLookCanceled; + } + // Обработка зума (камера) var zoomAction = gameplayMap.FindAction("Zoom"); - zoomAction.performed += OnZoomPerformed; - zoomAction.canceled += OnZoomCanceled; + if (zoomAction != null) + { + zoomAction.performed += OnZoomPerformed; + zoomAction.canceled += OnZoomCanceled; + } + // Обработка движения (персонаж) var moveAction = gameplayMap.FindAction("Move"); if (moveAction != null) { moveAction.performed += OnMovePerformed; moveAction.canceled += OnMoveCanceled; } + + // Обработка переключения режима камеры + var toggleCameraModeAction = gameplayMap.FindAction("ToggleCameraMode"); + if (toggleCameraModeAction != null) + { + toggleCameraModeAction.performed += OnToggleCameraModePerformed; + toggleCameraModeAction.canceled += OnToggleCameraModeCanceled; + } } private void OnLookPerformed(InputAction.CallbackContext context) @@ -70,6 +94,16 @@ namespace Code.Input { 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 DisableMap(ActionMappings actionMap) => _inputActionAsset.actionMaps[(int)actionMap].Disable(); @@ -86,10 +120,15 @@ namespace Code.Input var gameplayMap = _inputActionAsset.FindActionMap("Gameplay"); gameplayMap.FindAction("Look").performed -= OnLookPerformed; gameplayMap.FindAction("Look").canceled -= OnLookCanceled; + gameplayMap.FindAction("Zoom").performed -= OnZoomPerformed; gameplayMap.FindAction("Zoom").canceled -= OnZoomCanceled; + gameplayMap.FindAction("Move").performed -= OnMovePerformed; gameplayMap.FindAction("Move").canceled -= OnMoveCanceled; + + gameplayMap.FindAction("ToggleCameraMode").performed -= OnToggleCameraModePerformed; + gameplayMap.FindAction("ToggleCameraMode").canceled -= OnToggleCameraModeCanceled; } } } \ No newline at end of file diff --git a/Game/CourierOld/Assets/Resources/Materials/TestMaterial.mat b/Game/CourierOld/Assets/Resources/Materials/GroundTestMaterial.mat similarity index 99% rename from Game/CourierOld/Assets/Resources/Materials/TestMaterial.mat rename to Game/CourierOld/Assets/Resources/Materials/GroundTestMaterial.mat index c4d3026..037b2d4 100644 --- a/Game/CourierOld/Assets/Resources/Materials/TestMaterial.mat +++ b/Game/CourierOld/Assets/Resources/Materials/GroundTestMaterial.mat @@ -20,7 +20,7 @@ Material: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: TestMaterial + m_Name: GroundTestMaterial m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} m_Parent: {fileID: 0} m_ModifiedSerializedProperties: 0 diff --git a/Game/CourierOld/Assets/Resources/Materials/TestMaterial.mat.meta b/Game/CourierOld/Assets/Resources/Materials/GroundTestMaterial.mat.meta similarity index 100% rename from Game/CourierOld/Assets/Resources/Materials/TestMaterial.mat.meta rename to Game/CourierOld/Assets/Resources/Materials/GroundTestMaterial.mat.meta diff --git a/Game/CourierOld/Assets/Resources/Materials/WallsMateriall.mat b/Game/CourierOld/Assets/Resources/Materials/WallsMateriall.mat new file mode 100644 index 0000000..631a5bc --- /dev/null +++ b/Game/CourierOld/Assets/Resources/Materials/WallsMateriall.mat @@ -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 diff --git a/Game/CourierOld/Assets/Resources/Materials/WallsMateriall.mat.meta b/Game/CourierOld/Assets/Resources/Materials/WallsMateriall.mat.meta new file mode 100644 index 0000000..fcbebf6 --- /dev/null +++ b/Game/CourierOld/Assets/Resources/Materials/WallsMateriall.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b407164ea2464a05a97202efff71afc6 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity b/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity index 98149d0..6c42b91 100644 --- a/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity +++ b/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity @@ -358,20 +358,17 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: f1d98e6c5419411098391c07861e627e, type: 3} m_Name: m_EditorClassIdentifier: Assembly-CSharp::Code.Gameplay.Player.PlayerCamera - defaultDistance: 0 - minDistance: 0 + defaultDistance: 6 + minDistance: 3 maxDistance: 10 distanceMovementSpeed: 5 - distanceMovementSharpness: 10000 - rotationSpeed: 1 - rotationSharpness: 10000 - followSharpness: 10000 - minVerticalAngle: -45 - maxVerticalAngle: 45 + distanceMovementSharpness: 100 + rotationSpeed: 0.3 + rotationSharpness: 100 + followSharpness: 100 + minVerticalAngle: -70 + maxVerticalAngle: 70 defaultVerticalAngle: 10 - minHorizontalAngle: -90 - maxHorizontalAngle: 90 - defaultHorizontalAngle: 0 --- !u!1 &453575297 GameObject: m_ObjectHideFlags: 0 @@ -547,6 +544,117 @@ Transform: - {fileID: 1533098598} m_Father: {fileID: 1696686254} 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 GameObject: m_ObjectHideFlags: 0 @@ -637,6 +745,117 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1533098597} 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 GameObject: m_ObjectHideFlags: 0 @@ -822,3 +1041,5 @@ SceneRoots: - {fileID: 1959874991} - {fileID: 1696686254} - {fileID: 481156070} + - {fileID: 1376862595} + - {fileID: 1543748509} diff --git a/Game/CourierOld/Assets/Settings/Input/InputSystem_Actions.inputactions b/Game/CourierOld/Assets/Settings/Input/InputSystem_Actions.inputactions index 0042ac9..bf96e82 100644 --- a/Game/CourierOld/Assets/Settings/Input/InputSystem_Actions.inputactions +++ b/Game/CourierOld/Assets/Settings/Input/InputSystem_Actions.inputactions @@ -555,6 +555,15 @@ "interactions": "", "initialStateCheck": true }, + { + "name": "ToggleCameraMode", + "type": "Button", + "id": "53b8a816-6ab5-4c21-81e2-211187b50e95", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, { "name": "Attack", "type": "Button", @@ -769,7 +778,7 @@ "path": "/delta", "interactions": "", "processors": "", - "groups": ";Keyboard&Mouse;Touch", + "groups": ";Touch", "action": "Look", "isComposite": false, "isPartOfComposite": false @@ -791,7 +800,7 @@ "path": "/delta", "interactions": "", "processors": "", - "groups": "", + "groups": ";Keyboard&Mouse", "action": "Look", "isComposite": false, "isPartOfComposite": false @@ -1022,10 +1031,21 @@ "path": "/scroll/y", "interactions": "", "processors": "", - "groups": "", + "groups": ";Keyboard&Mouse", "action": "Zoom", "isComposite": false, "isPartOfComposite": false + }, + { + "name": "", + "id": "2f4c687f-f66c-4cd8-93f5-28628df0b86f", + "path": "/v", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "ToggleCameraMode", + "isComposite": false, + "isPartOfComposite": false } ] } From ee7771acd993f1bc8d3d7fe4d7fbe1b2cf2b92be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C5=A1a=20Ceviel?= <39222425+MrTorex@users.noreply.github.com> Date: Fri, 17 Oct 2025 14:48:39 +0300 Subject: [PATCH 4/4] =?UTF-8?q?=D0=98=D0=BD=D0=B8=D1=88=D0=B8=D0=B0=D0=BB?= =?UTF-8?q?=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=B3=D1=80=D0=B0=D0=B2=D0=B8=D1=82=D0=B0=D1=86=D0=B8=D0=B8?= =?UTF-8?q?=20=D0=B8=20=D0=BF=D1=80=D1=8B=D0=B6=D0=BA=D0=BE=D0=B2,=20?= =?UTF-8?q?=D0=BD=D1=83=D0=B6=D0=B4=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=B2?= =?UTF-8?q?=20=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B5.=20?= =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D1=8B=20=D0=BD=D0=B5=D0=B8=D1=81?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D1=83=D0=B5=D0=BC=D1=8B=D0=B5=20?= =?UTF-8?q?=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Gameplay/Player/CharacterController.cs | 82 +++-- .../Assets/Code/Gameplay/Player/Player.cs | 1 + .../Code/Gameplay/Player/PlayerCamera.cs | 3 - .../Assets/Code/Input/IInputService.cs | 1 + .../Assets/Code/Input/InputService.cs | 22 ++ .../Assets/Resources/Scenes/MovementDev.unity | 2 + .../Input/InputSystem_Actions.inputactions | 295 +----------------- 7 files changed, 97 insertions(+), 309 deletions(-) diff --git a/Game/CourierOld/Assets/Code/Gameplay/Player/CharacterController.cs b/Game/CourierOld/Assets/Code/Gameplay/Player/CharacterController.cs index 5c1b3ca..d4ae4f5 100644 --- a/Game/CourierOld/Assets/Code/Gameplay/Player/CharacterController.cs +++ b/Game/CourierOld/Assets/Code/Gameplay/Player/CharacterController.cs @@ -14,6 +14,7 @@ namespace Code.Gameplay.Player public Quaternion CameraRotation; // Текущее вращение камеры для определения направления движения public CameraMode CameraMode; // Текущий режим камеры для адаптации поведения public Vector3 CameraPlanarDirection; // Направление камеры в горизонтальной плоскости + public bool JumpPressed; // Флаг указывающий, нажата ли кнопка прыжка } /* @@ -32,8 +33,12 @@ namespace Code.Gameplay.Player private float maxStableMoveSpeed = 10f, // Максимальная скорость движения по устойчивой поверхности stableMovementSharpness = 15f, // Резкость изменения скорости движения (чем выше - тем резче) - orientationSharpness = 10f; // Резкость изменения вращения персонажа (чем выше - тем резче) + orientationSharpness = 10f, // Резкость изменения вращения персонажа (чем выше - тем резче) + jumpSpeed = 10f; // Скорость прыжка + [SerializeField] + private Vector3 gravity = new(0, -30f, 0); // Вектор, отвечающий за применение гравитации + // Векторы движения и направления взгляда private Vector3 _moveInputVector, _lookInputVector; @@ -43,8 +48,10 @@ namespace Code.Gameplay.Player // Вращение камеры в FirstPerson режиме для синхронизации (только горизонтальная компонента) private Quaternion _firstPersonCameraRotation; - // Флаг указывающий, что нужно применить вращение камеры к персонажу - private bool _shouldApplyCameraRotation; + + private bool + _shouldApplyCameraRotation, // Флаг указывающий, что нужно применить вращение камеры к персонажу + _jumpRequested; // Флаг указывающий, что был запрошен прыжок // Инициализация контроллера private void Start() @@ -72,6 +79,10 @@ namespace Code.Gameplay.Player { HandleThirdPersonInputs(ref inputs, moveInputVector); } + + // При запрашивании прыжка + if (inputs.JumpPressed) + _jumpRequested = true; } // Обработка ввода для FirstPerson режима @@ -180,28 +191,51 @@ namespace Code.Gameplay.Player // Обновление скорости движения персонажа public void UpdateVelocity(ref Vector3 currentVelocity, float deltaTime) { - // Сохранение текущей величины скорости - var currentVelocityMagnitude = currentVelocity.magnitude; - - // Получение нормали поверхности для корректного движения по наклонным плоскостям - var effectiveGroundNormal = motor.GroundingStatus.GroundNormal; - - // Переориентация текущей скорости вдоль поверхности - currentVelocity = motor.GetDirectionTangentToSurface(currentVelocity, effectiveGroundNormal) * currentVelocityMagnitude; + // Если персонаж находится на земле + if (motor.GroundingStatus.IsStableOnGround) + { + // Сохранение текущей величины скорости + var currentVelocityMagnitude = currentVelocity.magnitude; - // Переориентация входного вектора движения вдоль поверхности - var inputRight = Vector3.Cross(_moveInputVector, motor.CharacterUp); - var reorientedInput = Vector3.Cross(effectiveGroundNormal, inputRight).normalized * _moveInputVector.magnitude; - - // Расчет целевой скорости движения с учетом ограничения максимальной скорости - var targetMovementVelocity = reorientedInput * maxStableMoveSpeed; - - // Плавная интерполяция текущей скорости к целевой с экспоненциальным сглаживанием - currentVelocity = Vector3.Lerp( - currentVelocity, - targetMovementVelocity, - 1f - Mathf.Exp(-stableMovementSharpness * deltaTime) - ); + // Получение нормали поверхности для корректного движения по наклонным плоскостям + var effectiveGroundNormal = motor.GroundingStatus.GroundNormal; + + // Переориентация текущей скорости вдоль поверхности + currentVelocity = motor.GetDirectionTangentToSurface(currentVelocity, effectiveGroundNormal) * + currentVelocityMagnitude; + + // Переориентация входного вектора движения вдоль поверхности + var inputRight = Vector3.Cross(_moveInputVector, motor.CharacterUp); + var reorientedInput = Vector3.Cross(effectiveGroundNormal, inputRight).normalized * + _moveInputVector.magnitude; + + // Расчет целевой скорости движения с учетом ограничения максимальной скорости + var targetMovementVelocity = reorientedInput * maxStableMoveSpeed; + + // Плавная интерполяция текущей скорости к целевой с экспоненциальным сглаживанием + currentVelocity = Vector3.Lerp( + currentVelocity, + targetMovementVelocity, + 1f - Mathf.Exp(-stableMovementSharpness * deltaTime) + ); + + // Если запрошен прыжок + if (_jumpRequested) + { + currentVelocity += motor.CharacterUp * jumpSpeed - Vector3.Project(currentVelocity, motor.CharacterUp); + _jumpRequested = false; + motor.ForceUnground(); + } + } + + // Если персонаж не находится на земле + else + { + // Применяем гравитацию + currentVelocity += gravity * deltaTime; + // Отменяем прыжок (фикс проблемы с двойным прыжком после приземления) + _jumpRequested = false; + } } // Метод вызывается перед обновлением персонажа (можно использовать для подготовки) diff --git a/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs b/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs index c135e8b..350ddbe 100644 --- a/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs +++ b/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs @@ -57,6 +57,7 @@ public class Player : MonoBehaviour var moveInput = _inputService.MoveInput; inputs.MoveAxisForward = moveInput.y; // Vertical ось (W/S или Up/Down) inputs.MoveAxisRight = moveInput.x; // Horizontal ось (A/D или Left/Right) + inputs.JumpPressed = _inputService.JumpPressed; // Прыжки (Space) // Передаем информацию о камере для адаптивного поведения inputs.CameraRotation = playerCamera.transform.rotation; diff --git a/Game/CourierOld/Assets/Code/Gameplay/Player/PlayerCamera.cs b/Game/CourierOld/Assets/Code/Gameplay/Player/PlayerCamera.cs index bbee991..392ed4a 100644 --- a/Game/CourierOld/Assets/Code/Gameplay/Player/PlayerCamera.cs +++ b/Game/CourierOld/Assets/Code/Gameplay/Player/PlayerCamera.cs @@ -37,9 +37,6 @@ namespace Code.Gameplay.Player // Скорость зума камеры distanceMovementSpeed = 5f, // Множитель скорости изменения дистанции при зуме - // Скорость интерполяции текущая -> целевая позиция зума - distanceMovementSharpness = 100f, // Коэффициент плавности изменения дистанции (чем выше - тем резче) - // Скорость поворота камеры rotationSpeed = 0.3f, // Множитель скорости вращения камеры diff --git a/Game/CourierOld/Assets/Code/Input/IInputService.cs b/Game/CourierOld/Assets/Code/Input/IInputService.cs index 9a27af8..4dd0357 100644 --- a/Game/CourierOld/Assets/Code/Input/IInputService.cs +++ b/Game/CourierOld/Assets/Code/Input/IInputService.cs @@ -13,6 +13,7 @@ namespace Code.Input // Для управления движением персонажа Vector2 MoveInput { get; } + bool JumpPressed { get; } // Для переключения режима камеры bool ToggleCameraModePressed { get; } diff --git a/Game/CourierOld/Assets/Code/Input/InputService.cs b/Game/CourierOld/Assets/Code/Input/InputService.cs index 9c5509f..38e77f8 100644 --- a/Game/CourierOld/Assets/Code/Input/InputService.cs +++ b/Game/CourierOld/Assets/Code/Input/InputService.cs @@ -12,6 +12,7 @@ namespace Code.Input public Vector2 LookInput { get; private set; } public float ZoomInput { get; private set; } public Vector2 MoveInput { get; private set; } + public bool JumpPressed { get; private set; } public bool ToggleCameraModePressed { get; private set; } public InputService(InputActionAsset inputActionAsset) @@ -56,6 +57,14 @@ namespace Code.Input moveAction.canceled += OnMoveCanceled; } + // Обработка прыжков (персонаж) + var jumpAction = gameplayMap.FindAction("Jump"); + if (jumpAction != null) + { + jumpAction.performed += OnJumpPerformed; + jumpAction.canceled += OnJumpCanceled; + } + // Обработка переключения режима камеры var toggleCameraModeAction = gameplayMap.FindAction("ToggleCameraMode"); if (toggleCameraModeAction != null) @@ -95,6 +104,16 @@ namespace Code.Input MoveInput = Vector2.zero; } + private void OnJumpPerformed(InputAction.CallbackContext context) + { + JumpPressed = true; + } + + private void OnJumpCanceled(InputAction.CallbackContext context) + { + JumpPressed = false; + } + private void OnToggleCameraModePerformed(InputAction.CallbackContext context) { ToggleCameraModePressed = true; @@ -127,6 +146,9 @@ namespace Code.Input gameplayMap.FindAction("Move").performed -= OnMovePerformed; gameplayMap.FindAction("Move").canceled -= OnMoveCanceled; + gameplayMap.FindAction("Jump").performed -= OnJumpPerformed; + gameplayMap.FindAction("Jump").canceled -= OnJumpCanceled; + gameplayMap.FindAction("ToggleCameraMode").performed -= OnToggleCameraModePerformed; gameplayMap.FindAction("ToggleCameraMode").canceled -= OnToggleCameraModeCanceled; } diff --git a/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity b/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity index 6c42b91..1197926 100644 --- a/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity +++ b/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity @@ -989,6 +989,8 @@ MonoBehaviour: maxStableMoveSpeed: 10 stableMovementSharpness: 15 orientationSharpness: 10 + jumpSpeed: 10 + gravity: {x: 0, y: -30, z: 0} --- !u!1 &1959874989 GameObject: m_ObjectHideFlags: 0 diff --git a/Game/CourierOld/Assets/Settings/Input/InputSystem_Actions.inputactions b/Game/CourierOld/Assets/Settings/Input/InputSystem_Actions.inputactions index bf96e82..d6c191b 100644 --- a/Game/CourierOld/Assets/Settings/Input/InputSystem_Actions.inputactions +++ b/Game/CourierOld/Assets/Settings/Input/InputSystem_Actions.inputactions @@ -565,9 +565,9 @@ "initialStateCheck": false }, { - "name": "Attack", + "name": "Jump", "type": "Button", - "id": "6c2ab1b8-8984-453a-af3d-a3c78ae1679a", + "id": "f1ba0d36-48eb-4cd5-b651-1c94a6531f70", "expectedControlType": "", "processors": "", "interactions": "", @@ -582,42 +582,6 @@ "interactions": "Hold", "initialStateCheck": false }, - { - "name": "Crouch", - "type": "Button", - "id": "27c5f898-bc57-4ee1-8800-db469aca5fe3", - "expectedControlType": "Button", - "processors": "", - "interactions": "", - "initialStateCheck": false - }, - { - "name": "Jump", - "type": "Button", - "id": "f1ba0d36-48eb-4cd5-b651-1c94a6531f70", - "expectedControlType": "Button", - "processors": "", - "interactions": "", - "initialStateCheck": false - }, - { - "name": "Previous", - "type": "Button", - "id": "2776c80d-3c14-4091-8c56-d04ced07a2b0", - "expectedControlType": "Button", - "processors": "", - "interactions": "", - "initialStateCheck": false - }, - { - "name": "Next", - "type": "Button", - "id": "b7230bb6-fc9b-4f52-8b25-f5e19cb2c2ba", - "expectedControlType": "", - "processors": "", - "interactions": "", - "initialStateCheck": false - }, { "name": "Sprint", "type": "Button", @@ -626,20 +590,18 @@ "processors": "", "interactions": "", "initialStateCheck": false + }, + { + "name": "Slide", + "type": "Button", + "id": "27c5f898-bc57-4ee1-8800-db469aca5fe3", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false } ], "bindings": [ - { - "name": "", - "id": "978bfe49-cc26-4a3d-ab7b-7d7a29327403", - "path": "/leftStick", - "interactions": "", - "processors": "", - "groups": ";Gamepad", - "action": "Move", - "isComposite": false, - "isPartOfComposite": false - }, { "name": "WASD", "id": "00ca640b-d935-4593-8157-c05846ea39b3", @@ -739,61 +701,6 @@ "isComposite": false, "isPartOfComposite": true }, - { - "name": "", - "id": "1635d3fe-58b6-4ba9-a4e2-f4b964f6b5c8", - "path": "/{Primary2DAxis}", - "interactions": "", - "processors": "", - "groups": "XR", - "action": "Move", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "3ea4d645-4504-4529-b061-ab81934c3752", - "path": "/stick", - "interactions": "", - "processors": "", - "groups": "Joystick", - "action": "Move", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "c1f7a91b-d0fd-4a62-997e-7fb9b69bf235", - "path": "/rightStick", - "interactions": "", - "processors": "", - "groups": ";Gamepad", - "action": "Look", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "8c8e490b-c610-4785-884f-f04217b23ca4", - "path": "/delta", - "interactions": "", - "processors": "", - "groups": ";Touch", - "action": "Look", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "3e5f5442-8668-4b27-a940-df99bad7e831", - "path": "/{Hatswitch}", - "interactions": "", - "processors": "", - "groups": "Joystick", - "action": "Look", - "isComposite": false, - "isPartOfComposite": false - }, { "name": "", "id": "f8ca1921-4be2-4067-8199-ffea9bcefeee", @@ -805,94 +712,6 @@ "isComposite": false, "isPartOfComposite": false }, - { - "name": "", - "id": "143bb1cd-cc10-4eca-a2f0-a3664166fe91", - "path": "/buttonWest", - "interactions": "", - "processors": "", - "groups": ";Gamepad", - "action": "Attack", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "05f6913d-c316-48b2-a6bb-e225f14c7960", - "path": "/leftButton", - "interactions": "", - "processors": "", - "groups": ";Keyboard&Mouse", - "action": "Attack", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "886e731e-7071-4ae4-95c0-e61739dad6fd", - "path": "/primaryTouch/tap", - "interactions": "", - "processors": "", - "groups": ";Touch", - "action": "Attack", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "ee3d0cd2-254e-47a7-a8cb-bc94d9658c54", - "path": "/trigger", - "interactions": "", - "processors": "", - "groups": "Joystick", - "action": "Attack", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "8255d333-5683-4943-a58a-ccb207ff1dce", - "path": "/{PrimaryAction}", - "interactions": "", - "processors": "", - "groups": "XR", - "action": "Attack", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "b3c1c7f0-bd20-4ee7-a0f1-899b24bca6d7", - "path": "/enter", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "Attack", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "cbac6039-9c09-46a1-b5f2-4e5124ccb5ed", - "path": "/2", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "Next", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "e15ca19d-e649-4852-97d5-7fe8ccc44e94", - "path": "/dpad/right", - "interactions": "", - "processors": "", - "groups": "Gamepad", - "action": "Next", - "isComposite": false, - "isPartOfComposite": false - }, { "name": "", "id": "f2e9ba44-c423-42a7-ad56-f20975884794", @@ -904,28 +723,6 @@ "isComposite": false, "isPartOfComposite": false }, - { - "name": "", - "id": "8cbb2f4b-a784-49cc-8d5e-c010b8c7f4e6", - "path": "/leftStickPress", - "interactions": "", - "processors": "", - "groups": "Gamepad", - "action": "Sprint", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "d8bf24bf-3f2f-4160-a97c-38ec1eb520ba", - "path": "/trigger", - "interactions": "", - "processors": "", - "groups": "XR", - "action": "Sprint", - "isComposite": false, - "isPartOfComposite": false - }, { "name": "", "id": "eb40bb66-4559-4dfa-9a2f-820438abb426", @@ -937,50 +734,6 @@ "isComposite": false, "isPartOfComposite": false }, - { - "name": "", - "id": "daba33a1-ad0c-4742-a909-43ad1cdfbeb6", - "path": "/buttonSouth", - "interactions": "", - "processors": "", - "groups": "Gamepad", - "action": "Jump", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "603f3daf-40bd-4854-8724-93e8017f59e3", - "path": "/secondaryButton", - "interactions": "", - "processors": "", - "groups": "XR", - "action": "Jump", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "1534dc16-a6aa-499d-9c3a-22b47347b52a", - "path": "/1", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "Previous", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "25060bbd-a3a6-476e-8fba-45ae484aad05", - "path": "/dpad/left", - "interactions": "", - "processors": "", - "groups": "Gamepad", - "action": "Previous", - "isComposite": false, - "isPartOfComposite": false - }, { "name": "", "id": "1c04ea5f-b012-41d1-a6f7-02e963b52893", @@ -992,36 +745,14 @@ "isComposite": false, "isPartOfComposite": false }, - { - "name": "", - "id": "b3f66d0b-7751-423f-908b-a11c5bd95930", - "path": "/buttonNorth", - "interactions": "", - "processors": "", - "groups": "Gamepad", - "action": "Interact", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "4f4649ac-64a8-4a73-af11-b3faef356a4d", - "path": "/buttonEast", - "interactions": "", - "processors": "", - "groups": "Gamepad", - "action": "Crouch", - "isComposite": false, - "isPartOfComposite": false - }, { "name": "", "id": "36e52cba-0905-478e-a818-f4bfcb9f3b9a", - "path": "/c", + "path": "/leftCtrl", "interactions": "", "processors": "", "groups": "Keyboard&Mouse", - "action": "Crouch", + "action": "Slide", "isComposite": false, "isPartOfComposite": false },