Вынос настроек персонажа в конфиг

В который сейчас будет добавлено пару новых настроек
This commit is contained in:
MrTorex committed 2025-10-29 11:17:27 +03:00
1 parent 665114b7dc
commit fb85b22e96
9 files changed
+100 -30

No files matched your search

@@ -60,6 +60,7 @@ namespace Code.App
containerBuilder.AddSingleton(staticDataService, typeof(IStaticDataService)); containerBuilder.AddSingleton(staticDataService, typeof(IStaticDataService));
containerBuilder.AddSingleton(staticDataService.InputConfig.inputActionAsset, typeof(InputActionAsset)); containerBuilder.AddSingleton(staticDataService.InputConfig.inputActionAsset, typeof(InputActionAsset));
containerBuilder.AddSingleton(staticDataService.CameraConfig, typeof(CameraConfig)); containerBuilder.AddSingleton(staticDataService.CameraConfig, typeof(CameraConfig));
containerBuilder.AddSingleton(staticDataService.CharacterConfig, typeof(CharacterConfig));
} }
private void Bootstrap(Container container) private void Bootstrap(Container container)
@@ -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); // Вектор, отвечающий за применение гравитации
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 10cfaf8e57f64eddb8c2eda147e4739a
timeCreated: 1761723608
@@ -1,7 +1,6 @@
using Code.Gameplay.Camera; using Code.Gameplay.Camera;
using KinematicCharacterController; using KinematicCharacterController;
using UnityEngine; using UnityEngine;
using Code.Gameplay.Character.Core;
namespace Code.Gameplay.Character.Controller.Abilities namespace Code.Gameplay.Character.Controller.Abilities
{ {
@@ -1,9 +1,11 @@
using Code.Configs;
using Code.Gameplay.Camera; using Code.Gameplay.Camera;
using Code.Gameplay.Character.Controller.Abilities; using Code.Gameplay.Character.Controller.Abilities;
using Code.Gameplay.Character.Controller.Input; using Code.Gameplay.Character.Controller.Input;
using Code.Gameplay.Character.Controller.Movement; using Code.Gameplay.Character.Controller.Movement;
using Code.Gameplay.Character.Core; using Code.Gameplay.Character.Core;
using KinematicCharacterController; using KinematicCharacterController;
using Reflex.Attributes;
using UnityEngine; using UnityEngine;
namespace Code.Gameplay.Character.Controller namespace Code.Gameplay.Character.Controller
@@ -17,40 +19,39 @@ namespace Code.Gameplay.Character.Controller
*/ */
public class CustomCharacterController : MonoBehaviour, ICharacterController public class CustomCharacterController : MonoBehaviour, ICharacterController
{ {
[Inject] private CharacterConfig _characterConfig; // Конфиг персонажа через DI
[SerializeField] [SerializeField]
private KinematicCharacterMotor motor; // Движок физического перемещения персонажа 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 CharacterInputHandler _inputHandler;
private readonly SlideMechanic _slideMechanic; private SlideMechanic _slideMechanic;
private readonly WallClimbMechanic _wallClimbMechanic; private WallClimbMechanic _wallClimbMechanic;
private readonly GroundMovementSystem _groundMovement; private GroundMovementSystem _groundMovement;
private readonly AirMovementSystem _airMovement; private AirMovementSystem _airMovement;
// Конструктор без параметров, инициализирующий контроллер // Инициализация контроллера
public CustomCharacterController() private void Awake()
{ {
// Инициализация подсистем с параметрами из конфига
_inputHandler = new CharacterInputHandler(); _inputHandler = new CharacterInputHandler();
_slideMechanic = new SlideMechanic(slideSpeed, slideDuration, slideCooldown); _slideMechanic = new SlideMechanic(
_wallClimbMechanic = new WallClimbMechanic(wallClimbSpeedFactor, minWallClimbSpeed); _characterConfig.slideSpeed,
_groundMovement = new GroundMovementSystem(maxStableMoveSpeed, sprintMoveSpeed, stableMovementSharpness, jumpSpeed); _characterConfig.slideDuration,
_airMovement = new AirMovementSystem(gravity); _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: case CameraMode.ThirdPerson:
{ {
// Вращение применяется только если есть направление движения и разрешена резкость вращения // Вращение применяется только если есть направление движения и разрешена резкость вращения
if (_inputHandler.LookInputVector.sqrMagnitude > 0 && orientationSharpness > 0) if (_inputHandler.LookInputVector.sqrMagnitude > 0 && _characterConfig.orientationSharpness > 0)
{ {
// Плавная интерполяция текущего направления к целевому с экспоненциальным сглаживанием // Плавная интерполяция текущего направления к целевому с экспоненциальным сглаживанием
var smoothedLookInputDirection = Vector3.Slerp( var smoothedLookInputDirection = Vector3.Slerp(
motor.CharacterForward, motor.CharacterForward,
_inputHandler.LookInputVector, _inputHandler.LookInputVector,
1f - Mathf.Exp(-orientationSharpness * deltaTime) 1f - Mathf.Exp(-_characterConfig.orientationSharpness * deltaTime)
).normalized; ).normalized;
// Установка нового вращения смотря в сглаженном направлении // Установка нового вращения смотря в сглаженном направлении
@@ -9,5 +9,6 @@ namespace Code.StaticData
InputConfig InputConfig { get; } InputConfig InputConfig { get; }
AppConfig AppConfig { get; } AppConfig AppConfig { get; }
CameraConfig CameraConfig { get; } CameraConfig CameraConfig { get; }
CharacterConfig CharacterConfig { get; }
} }
} }
@@ -9,12 +9,14 @@ namespace Code.StaticData
public AppConfig AppConfig { get; private set; } public AppConfig AppConfig { get; private set; }
public InputConfig InputConfig { get; private set; } public InputConfig InputConfig { get; private set; }
public CameraConfig CameraConfig { get; private set; } public CameraConfig CameraConfig { get; private set; }
public CharacterConfig CharacterConfig { get; private set; }
public void Load() public void Load()
{ {
InputConfig = Resources.Load<InputConfig>(string.Format(StringPaths.ConfigSingle, "App", "InputConfig")); InputConfig = Resources.Load<InputConfig>(string.Format(StringPaths.ConfigSingle, "App", "InputConfig"));
AppConfig = Resources.Load<AppConfig>(string.Format(StringPaths.ConfigSingle, "App", "AppConfig")); AppConfig = Resources.Load<AppConfig>(string.Format(StringPaths.ConfigSingle, "App", "AppConfig"));
CameraConfig = Resources.Load<CameraConfig>(string.Format(StringPaths.ConfigSingle, "App", "CameraConfig")); CameraConfig = Resources.Load<CameraConfig>(string.Format(StringPaths.ConfigSingle, "App", "CameraConfig"));
CharacterConfig = Resources.Load<CharacterConfig>(string.Format(StringPaths.ConfigSingle, "App", "CharacterConfig"));
} }
} }
} }
@@ -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}
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 95fe36bc4922ed1b9bb9e7c9ed5da1eb
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant: