Допил наклонов (они такое себе)
Хуже, чем были раньше, но лучше, чем ничего. Плавность переходов имеется, и на том спасибо
This commit is contained in:
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); // Вектор, отвечающий за применение гравитации
|
||||||
|
|||||||
+40
-21
@@ -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,
|
||||||
|
|||||||
Reference in new issue
Block a user