This commit is contained in:
MrTorex committed 2025-12-05 14:43:04 +03:00
1 parent 6f777ba8a3
commit 2cca6d8ffb
3 files changed
+30 -6

No files matched your search

@@ -48,6 +48,8 @@ namespace Code.Configs
wallRunAcceleration = 25f, wallRunAcceleration = 25f,
wallRunGravityScale = 0.25f, wallRunGravityScale = 0.25f,
wallDetachImpulse = 7f, wallDetachImpulse = 7f,
wallContactAngleThreshold = 45f; wallContactAngleThreshold = 45f,
minLookWithNormal = 30f,
maxLookWithNormal = 60f;
} }
} }
@@ -23,6 +23,11 @@ namespace Code.Gameplay.Character.Controller.Abilities
private float _surfaceAngleCos; private float _surfaceAngleCos;
private bool _canWallRun; private bool _canWallRun;
private readonly float _minLookAngleToWallPlane;
private readonly float _maxLookAngleToWallPlane;
private float _minLookDotWithNormal;
private float _maxLookDotWithNormal;
private KinematicCharacterMotor _motor; private KinematicCharacterMotor _motor;
public bool IsWallRunning { get; private set; } public bool IsWallRunning { get; private set; }
@@ -33,7 +38,9 @@ namespace Code.Gameplay.Character.Controller.Abilities
float wallRunAcceleration, float wallRunAcceleration,
float wallRunGravityScale, float wallRunGravityScale,
float wallDetachImpulse, float wallDetachImpulse,
float wallContactAngleThreshold) float wallContactAngleThreshold,
float minLookAngleToWallPlane,
float maxLookAngleToWallPlane)
{ {
_maxWallRunTime = maxWallRunTime; _maxWallRunTime = maxWallRunTime;
_wallRunSpeed = wallRunSpeed; _wallRunSpeed = wallRunSpeed;
@@ -41,12 +48,20 @@ namespace Code.Gameplay.Character.Controller.Abilities
_wallRunGravityScale = wallRunGravityScale; _wallRunGravityScale = wallRunGravityScale;
_wallDetachImpulse = wallDetachImpulse; _wallDetachImpulse = wallDetachImpulse;
_wallContactAngleThreshold = wallContactAngleThreshold; _wallContactAngleThreshold = wallContactAngleThreshold;
_minLookAngleToWallPlane = Mathf.Clamp(minLookAngleToWallPlane, 0f, 90f);
_maxLookAngleToWallPlane = Mathf.Clamp(maxLookAngleToWallPlane, 0f, 90f);
} }
public void Initialize(KinematicCharacterMotor motor) public void Initialize(KinematicCharacterMotor motor)
{ {
_motor = motor; _motor = motor;
_surfaceAngleCos = Mathf.Cos(Mathf.Deg2Rad * _wallContactAngleThreshold); _surfaceAngleCos = Mathf.Cos(Mathf.Deg2Rad * _wallContactAngleThreshold);
var minAngleWithNormal = 90f - _maxLookAngleToWallPlane;
var maxAngleWithNormal = 90f - _minLookAngleToWallPlane;
_maxLookDotWithNormal = Mathf.Cos(Mathf.Deg2Rad * minAngleWithNormal);
_minLookDotWithNormal = Mathf.Cos(Mathf.Deg2Rad * maxAngleWithNormal);
} }
public void Tick(float deltaTime) public void Tick(float deltaTime)
@@ -60,13 +75,12 @@ namespace Code.Gameplay.Character.Controller.Abilities
} }
} }
public bool TryStartWallRun(Vector3 hitNormal, Vector3 hitPoint) public bool TryStartWallRun(Vector3 hitNormal, Vector3 hitPoint, Vector3 lookDirection)
{ {
if (IsWallRunning) return false; if (IsWallRunning) return false;
var dotWithUp = Vector3.Dot(hitNormal, _motor.CharacterUp); var dotWithUp = Vector3.Dot(hitNormal, _motor.CharacterUp);
var isWall = Mathf.Abs(dotWithUp) < _surfaceAngleCos; var isWall = Mathf.Abs(dotWithUp) < _surfaceAngleCos;
if (!isWall) return false; if (!isWall) return false;
if (_motor.GroundingStatus.IsStableOnGround) return false; if (_motor.GroundingStatus.IsStableOnGround) return false;
@@ -74,6 +88,12 @@ namespace Code.Gameplay.Character.Controller.Abilities
var velocityIntoWall = Vector3.Dot(_motor.Velocity, -hitNormal); var velocityIntoWall = Vector3.Dot(_motor.Velocity, -hitNormal);
if (velocityIntoWall < 1f) return false; if (velocityIntoWall < 1f) return false;
var lookDirNormalized = lookDirection.normalized;
var dotWithNormal = Vector3.Dot(lookDirNormalized, hitNormal);
if (Mathf.Abs(dotWithNormal) < _minLookDotWithNormal || Mathf.Abs(dotWithNormal) > _maxLookDotWithNormal)
return false;
StartWallRun(hitNormal, hitPoint); StartWallRun(hitNormal, hitPoint);
return true; return true;
} }
@@ -88,7 +88,9 @@ namespace Code.Gameplay.Character.Controller
_characterConfig.wallRunAcceleration, _characterConfig.wallRunAcceleration,
_characterConfig.wallRunGravityScale, _characterConfig.wallRunGravityScale,
_characterConfig.wallDetachImpulse, _characterConfig.wallDetachImpulse,
_characterConfig.wallContactAngleThreshold _characterConfig.wallContactAngleThreshold,
_characterConfig.minLookWithNormal,
_characterConfig.maxLookWithNormal
); );
_wallLeanMechanic = new WallLeanMechanic( _wallLeanMechanic = new WallLeanMechanic(
_characterConfig.leanAngle, _characterConfig.leanAngle,
@@ -422,7 +424,7 @@ namespace Code.Gameplay.Character.Controller
public void OnMovementHit(Collider hitCollider, Vector3 hitNormal, Vector3 hitPoint, public void OnMovementHit(Collider hitCollider, Vector3 hitNormal, Vector3 hitPoint,
ref HitStabilityReport hitStabilityReport) ref HitStabilityReport hitStabilityReport)
{ {
if (_wallRunningMechanic.TryStartWallRun(hitNormal, hitPoint)) return; if (_wallRunningMechanic.TryStartWallRun(hitNormal, hitPoint, motor.CharacterForward)) return;
var horizontalVelocity = Vector3.ProjectOnPlane(motor.Velocity, motor.CharacterUp).normalized; var horizontalVelocity = Vector3.ProjectOnPlane(motor.Velocity, motor.CharacterUp).normalized;
var velocitySqrMag = horizontalVelocity.sqrMagnitude; var velocitySqrMag = horizontalVelocity.sqrMagnitude;