Допил наклонов (они такое себе)

Хуже, чем были раньше, но лучше, чем ничего. Плавность переходов имеется, и на том спасибо
This commit is contained in:
MrTorex committed 2025-11-28 01:15:44 +03:00
1 parent 766609489d
commit 4b6909fe84
3 files changed
+47 -30

No files matched your search

@@ -1,4 +1,5 @@
using UnityEngine; using UnityEngine;
using UnityEngine.Serialization;
namespace Code.Configs namespace Code.Configs
{ {
@@ -23,17 +24,11 @@ namespace Code.Configs
slideDuration = 0.8f, // Длительность слайда в секундах slideDuration = 0.8f, // Длительность слайда в секундах
slideCooldown = 1.5f; // Время перезарядки слайда в секундах slideCooldown = 1.5f; // Время перезарядки слайда в секундах
// Залазание на стены
public float
wallClimbSpeedFactor = 0.8f, // Коэффициент преобразования горизонтальной скорости в вертикальную при залазании на стену
minWallClimbSpeed = 9f, // Минимальная горизонтальная скорость для начала залазания на стену
wallDetectionAngleThreshold = 80f; // Максимальный угол (в градусах) от вертикали, при котором поверхность считается "стеной"
// Наклон при залазании на стены // Наклон при залазании на стены
public float public float
maxWallLeanAngle = 45f, // Максимальный угол наклона от стены (в градусах) leanAngle = 25f,
wallLeanSharpness = 50f, // Скорость наклона/выпрямления (чем выше — тем резче) leanThreshold = 0.3f,
wallLeanHeightScale = 0.1f; // Множитель: на сколько метров подъёма = 1 единица "наклона" leanSmoothSpeed = 10f;
// Гравитация // Гравитация
public Vector3 gravity = new(0f, -30f, 0f); // Вектор, отвечающий за применение гравитации public Vector3 gravity = new(0f, -30f, 0f); // Вектор, отвечающий за применение гравитации
@@ -4,56 +4,75 @@ namespace Code.Gameplay.Character.Controller.Abilities
{ {
public class WallLeanMechanic public class WallLeanMechanic
{ {
private readonly float _leanAngle;
private readonly float _threshold;
private readonly float _smoothSpeed;
private Transform _model; private Transform _model;
public WallLeanMechanic(
float leanAngle,
float threshold,
float smoothSpeed)
{
_leanAngle = leanAngle;
_threshold = threshold;
_smoothSpeed = smoothSpeed;
}
public void SetModel(Transform model) => _model = model; public void SetModel(Transform model) => _model = model;
public void Update(bool isWallRunning, Vector3 wallNormal, Vector3 characterForward) public void Update(bool isWallRunning, Vector3 wallNormal, Vector3 characterForward)
{ {
if (_model == null) if (!_model)
{ {
_model.localRotation = Quaternion.identity; _model.localRotation = Quaternion.identity;
return; return;
} }
if (!isWallRunning) var targetRotation = Quaternion.identity;
{
_model.localRotation = Quaternion.identity;
return;
}
Vector3 n = new Vector3(wallNormal.x, 0f, wallNormal.z).normalized; if (isWallRunning)
{
var n = new Vector3(wallNormal.x, 0f, wallNormal.z).normalized;
if (n.sqrMagnitude < 0.001f) n = Vector3.forward; if (n.sqrMagnitude < 0.001f) n = Vector3.forward;
Vector3 bodyRight = Vector3.Cross(Vector3.up, characterForward).normalized; var bodyRight = Vector3.Cross(Vector3.up, characterForward).normalized;
float side = Vector3.Dot(n, bodyRight); var side = Vector3.Dot(n, bodyRight);
float front = Vector3.Dot(n, characterForward); var front = Vector3.Dot(n, characterForward);
Vector3 axis = Vector3.right; var axis = Vector3.right;
float angle = 0f; var angle = 0f;
if (side > 0.3f) if (side > _threshold)
{ {
axis = Vector3.forward; axis = Vector3.forward;
angle = -25f; angle = -_leanAngle;
} }
else if (side < -0.3f) else if (side < -_threshold)
{ {
axis = Vector3.forward; axis = Vector3.forward;
angle = 25f; angle = _leanAngle;
} }
else if (front > 0.3f) else if (front > _threshold)
{ {
axis = Vector3.right; axis = Vector3.right;
angle = -25f; angle = -_leanAngle;
} }
else if (front < -0.3f) else if (front < -_threshold)
{ {
axis = Vector3.right; axis = Vector3.right;
angle = 25f; angle = _leanAngle;
} }
_model.localRotation = Quaternion.AngleAxis(angle, axis); targetRotation = Quaternion.AngleAxis(angle, axis);
}
_model.localRotation = Quaternion.Slerp(
_model.localRotation,
targetRotation,
1f - Mathf.Exp(-_smoothSpeed * Time.deltaTime)
);
} }
} }
} }
@@ -73,6 +73,9 @@ namespace Code.Gameplay.Character.Controller
_wallRunningMechanic.WallContactAngleThreshold = 45.0f; _wallRunningMechanic.WallContactAngleThreshold = 45.0f;
_wallLeanMechanic = new WallLeanMechanic( _wallLeanMechanic = new WallLeanMechanic(
_characterConfig.leanAngle,
_characterConfig.leanThreshold,
_characterConfig.leanSmoothSpeed
); );
_groundMovement = new GroundMovementSystem( _groundMovement = new GroundMovementSystem(
_characterConfig.maxStableMoveSpeed, _characterConfig.maxStableMoveSpeed,