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

В который сейчас будет добавлено пару новых настроек
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.InputConfig.inputActionAsset, typeof(InputActionAsset));
containerBuilder.AddSingleton(staticDataService.CameraConfig, typeof(CameraConfig));
containerBuilder.AddSingleton(staticDataService.CharacterConfig, typeof(CharacterConfig));
}
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 KinematicCharacterController;
using UnityEngine;
using Code.Gameplay.Character.Core;
namespace Code.Gameplay.Character.Controller.Abilities
{
@@ -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;
// Установка нового вращения смотря в сглаженном направлении
@@ -9,5 +9,6 @@ namespace Code.StaticData
InputConfig InputConfig { get; }
AppConfig AppConfig { get; }
CameraConfig CameraConfig { get; }
CharacterConfig CharacterConfig { get; }
}
}
@@ -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<InputConfig>(string.Format(StringPaths.ConfigSingle, "App", "InputConfig"));
AppConfig = Resources.Load<AppConfig>(string.Format(StringPaths.ConfigSingle, "App", "AppConfig"));
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: