diff --git a/Game/CourierOld/Assets/Code/App/BootstrapInstaller.cs b/Game/CourierOld/Assets/Code/App/BootstrapInstaller.cs index 420f246..9a28635 100644 --- a/Game/CourierOld/Assets/Code/App/BootstrapInstaller.cs +++ b/Game/CourierOld/Assets/Code/App/BootstrapInstaller.cs @@ -60,6 +60,7 @@ namespace Code.App containerBuilder.AddSingleton(staticDataService, typeof(IStaticDataService)); containerBuilder.AddSingleton(staticDataService.InputConfig.inputActionAsset, typeof(InputActionAsset)); containerBuilder.AddSingleton(staticDataService.CameraConfig, typeof(CameraConfig)); + containerBuilder.AddSingleton(staticDataService.CharacterConfig, typeof(CharacterConfig)); } private void Bootstrap(Container container) diff --git a/Game/CourierOld/Assets/Code/Configs/CharacterConfig.cs b/Game/CourierOld/Assets/Code/Configs/CharacterConfig.cs new file mode 100644 index 0000000..14124e1 --- /dev/null +++ b/Game/CourierOld/Assets/Code/Configs/CharacterConfig.cs @@ -0,0 +1,30 @@ +using UnityEngine; + +namespace Code.Configs +{ + [CreateAssetMenu(fileName = "CharacterConfig", menuName = "Config/CharacterConfig")] + public class CharacterConfig : ScriptableObject + { + // Основное движение по земле + public float + maxStableMoveSpeed = 8f, // Максимальная скорость движения по устойчивой поверхности + sprintMoveSpeed = 12f, // Максимальная скорость спринта + stableMovementSharpness = 15f, // Резкость изменения скорости движения (чем выше - тем резче) + orientationSharpness = 10f, // Резкость изменения вращения персонажа (чем выше - тем резче) + jumpSpeed = 10f; // Скорость прыжка + + // Слайд + public float + slideSpeed = 20f, // Скорость слайда + slideDuration = 0.8f, // Длительность слайда в секундах + slideCooldown = 1.5f; // Время перезарядки слайда в секундах + + // Залазание на стены + public float + wallClimbSpeedFactor = 0.8f, // Коэффициент преобразования горизонтальной скорости в вертикальную при залазании на стену + minWallClimbSpeed = 9f; // Минимальная горизонтальная скорость для начала залазания на стену + + // Гравитация + public Vector3 gravity = new(0f, -30f, 0f); // Вектор, отвечающий за применение гравитации + } +} \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/Configs/CharacterConfig.cs.meta b/Game/CourierOld/Assets/Code/Configs/CharacterConfig.cs.meta new file mode 100644 index 0000000..dc42555 --- /dev/null +++ b/Game/CourierOld/Assets/Code/Configs/CharacterConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 10cfaf8e57f64eddb8c2eda147e4739a +timeCreated: 1761723608 \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/Abilities/SlideMechanic.cs b/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/Abilities/SlideMechanic.cs index 038b6d7..8363653 100644 --- a/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/Abilities/SlideMechanic.cs +++ b/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/Abilities/SlideMechanic.cs @@ -1,7 +1,6 @@ using Code.Gameplay.Camera; using KinematicCharacterController; using UnityEngine; -using Code.Gameplay.Character.Core; namespace Code.Gameplay.Character.Controller.Abilities { diff --git a/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/CustomCharacterController.cs b/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/CustomCharacterController.cs index 29ec127..e5bd3df 100644 --- a/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/CustomCharacterController.cs +++ b/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/CustomCharacterController.cs @@ -1,9 +1,11 @@ +using Code.Configs; using Code.Gameplay.Camera; using Code.Gameplay.Character.Controller.Abilities; using Code.Gameplay.Character.Controller.Input; using Code.Gameplay.Character.Controller.Movement; using Code.Gameplay.Character.Core; using KinematicCharacterController; +using Reflex.Attributes; using UnityEngine; namespace Code.Gameplay.Character.Controller @@ -17,40 +19,39 @@ namespace Code.Gameplay.Character.Controller */ public class CustomCharacterController : MonoBehaviour, ICharacterController { + [Inject] private CharacterConfig _characterConfig; // Конфиг персонажа через DI + [SerializeField] private KinematicCharacterMotor motor; // Движок физического перемещения персонажа - - [SerializeField] - private float - maxStableMoveSpeed = 8f, // Максимальная скорость движения по устойчивой поверхности - sprintMoveSpeed = 12f, // Максимальная скорость спринта - slideSpeed = 20f, // Скорость слайда - slideDuration = 0.8f, // Длительность слайда в секундах - slideCooldown = 1.5f, // Время перезарядки слайда - stableMovementSharpness = 15f, // Резкость изменения скорости движения (чем выше - тем резче) - orientationSharpness = 10f, // Резкость изменения вращения персонажа (чем выше - тем резче) - jumpSpeed = 10f, // Скорость прыжка - wallClimbSpeedFactor = 0.8f, // Коэффициент преобразования горизонтальной скорости в вертикальную при залазании на стену - minWallClimbSpeed = 9f; // Минимальная горизонтальная скорость для начала залазания на стену - - [SerializeField] - private Vector3 gravity = new(0, -30f, 0); // Вектор, отвечающий за применение гравитации // Подсистемы - private readonly CharacterInputHandler _inputHandler; - private readonly SlideMechanic _slideMechanic; - private readonly WallClimbMechanic _wallClimbMechanic; - private readonly GroundMovementSystem _groundMovement; - private readonly AirMovementSystem _airMovement; + private CharacterInputHandler _inputHandler; + private SlideMechanic _slideMechanic; + private WallClimbMechanic _wallClimbMechanic; + private GroundMovementSystem _groundMovement; + private AirMovementSystem _airMovement; - // Конструктор без параметров, инициализирующий контроллер - public CustomCharacterController() + // Инициализация контроллера + private void Awake() { + // Инициализация подсистем с параметрами из конфига _inputHandler = new CharacterInputHandler(); - _slideMechanic = new SlideMechanic(slideSpeed, slideDuration, slideCooldown); - _wallClimbMechanic = new WallClimbMechanic(wallClimbSpeedFactor, minWallClimbSpeed); - _groundMovement = new GroundMovementSystem(maxStableMoveSpeed, sprintMoveSpeed, stableMovementSharpness, jumpSpeed); - _airMovement = new AirMovementSystem(gravity); + _slideMechanic = new SlideMechanic( + _characterConfig.slideSpeed, + _characterConfig.slideDuration, + _characterConfig.slideCooldown + ); + _wallClimbMechanic = new WallClimbMechanic( + _characterConfig.wallClimbSpeedFactor, + _characterConfig.minWallClimbSpeed + ); + _groundMovement = new GroundMovementSystem( + _characterConfig.maxStableMoveSpeed, + _characterConfig.sprintMoveSpeed, + _characterConfig.stableMovementSharpness, + _characterConfig.jumpSpeed + ); + _airMovement = new AirMovementSystem(_characterConfig.gravity); } // Текущий режим камеры для адаптации поведения @@ -110,13 +111,13 @@ namespace Code.Gameplay.Character.Controller case CameraMode.ThirdPerson: { // Вращение применяется только если есть направление движения и разрешена резкость вращения - if (_inputHandler.LookInputVector.sqrMagnitude > 0 && orientationSharpness > 0) + if (_inputHandler.LookInputVector.sqrMagnitude > 0 && _characterConfig.orientationSharpness > 0) { // Плавная интерполяция текущего направления к целевому с экспоненциальным сглаживанием var smoothedLookInputDirection = Vector3.Slerp( motor.CharacterForward, _inputHandler.LookInputVector, - 1f - Mathf.Exp(-orientationSharpness * deltaTime) + 1f - Mathf.Exp(-_characterConfig.orientationSharpness * deltaTime) ).normalized; // Установка нового вращения смотря в сглаженном направлении diff --git a/Game/CourierOld/Assets/Code/StaticData/IStaticDataService.cs b/Game/CourierOld/Assets/Code/StaticData/IStaticDataService.cs index 9f21d9f..f895581 100644 --- a/Game/CourierOld/Assets/Code/StaticData/IStaticDataService.cs +++ b/Game/CourierOld/Assets/Code/StaticData/IStaticDataService.cs @@ -9,5 +9,6 @@ namespace Code.StaticData InputConfig InputConfig { get; } AppConfig AppConfig { get; } CameraConfig CameraConfig { get; } + CharacterConfig CharacterConfig { get; } } } \ No newline at end of file diff --git a/Game/CourierOld/Assets/Code/StaticData/StaticDataService.cs b/Game/CourierOld/Assets/Code/StaticData/StaticDataService.cs index 0d5f835..4ede641 100644 --- a/Game/CourierOld/Assets/Code/StaticData/StaticDataService.cs +++ b/Game/CourierOld/Assets/Code/StaticData/StaticDataService.cs @@ -9,12 +9,14 @@ namespace Code.StaticData public AppConfig AppConfig { get; private set; } public InputConfig InputConfig { get; private set; } public CameraConfig CameraConfig { get; private set; } + public CharacterConfig CharacterConfig { get; private set; } public void Load() { InputConfig = Resources.Load(string.Format(StringPaths.ConfigSingle, "App", "InputConfig")); AppConfig = Resources.Load(string.Format(StringPaths.ConfigSingle, "App", "AppConfig")); CameraConfig = Resources.Load(string.Format(StringPaths.ConfigSingle, "App", "CameraConfig")); + CharacterConfig = Resources.Load(string.Format(StringPaths.ConfigSingle, "App", "CharacterConfig")); } } } \ No newline at end of file diff --git a/Game/CourierOld/Assets/Resources/Configs/App/CharacterConfig.asset b/Game/CourierOld/Assets/Resources/Configs/App/CharacterConfig.asset new file mode 100644 index 0000000..d25d86b --- /dev/null +++ b/Game/CourierOld/Assets/Resources/Configs/App/CharacterConfig.asset @@ -0,0 +1,25 @@ +%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: 10cfaf8e57f64eddb8c2eda147e4739a, type: 3} + m_Name: CharacterConfig + m_EditorClassIdentifier: Assembly-CSharp::Code.Configs.CharacterConfig + maxStableMoveSpeed: 8 + sprintMoveSpeed: 12 + stableMovementSharpness: 15 + orientationSharpness: 10 + jumpSpeed: 10 + slideSpeed: 20 + slideDuration: 0.8 + slideCooldown: 1.5 + wallClimbSpeedFactor: 0.8 + minWallClimbSpeed: 9 + gravity: {x: 0, y: -30, z: 0} diff --git a/Game/CourierOld/Assets/Resources/Configs/App/CharacterConfig.asset.meta b/Game/CourierOld/Assets/Resources/Configs/App/CharacterConfig.asset.meta new file mode 100644 index 0000000..926e78d --- /dev/null +++ b/Game/CourierOld/Assets/Resources/Configs/App/CharacterConfig.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 95fe36bc4922ed1b9bb9e7c9ed5da1eb +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: