diff --git a/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/Abilities/WallRunningMechanic.cs b/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/Abilities/WallRunningMechanic.cs index 5043fa7..33470db 100644 --- a/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/Abilities/WallRunningMechanic.cs +++ b/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/Abilities/WallRunningMechanic.cs @@ -88,12 +88,25 @@ namespace Code.Gameplay.Character.Controller.Abilities var forwardInWallPlane = Vector3.ProjectOnPlane(_motor.CharacterForward, _wallNormal).normalized; if (forwardInWallPlane.sqrMagnitude < 0.01f) { - var fallbackRight = Vector3.Cross(_wallNormal, _wallTangentUp).normalized; + var candidateRight = Vector3.Cross(_wallNormal, _motor.CharacterUp); + candidateRight = Vector3.ProjectOnPlane(candidateRight, _wallNormal).normalized; + + if (candidateRight.sqrMagnitude < 0.01f) + { + candidateRight = Vector3.Cross(_wallNormal, Vector3.up); + candidateRight = Vector3.ProjectOnPlane(candidateRight, _wallNormal).normalized; + } + + if (candidateRight.sqrMagnitude < 0.01f) + { + candidateRight = Vector3.Cross(_wallNormal, Vector3.right).normalized; + } + var dotWithRight = Vector3.Dot(_motor.CharacterRight, _wallNormal); - forwardInWallPlane = dotWithRight < 0 ? fallbackRight : -fallbackRight; + forwardInWallPlane = dotWithRight < 0 ? candidateRight : -candidateRight; } - _wallTangentRight = forwardInWallPlane; + _wallTangentRight = forwardInWallPlane.normalized; _wallTangentUp = Vector3.Cross(_wallTangentRight, -_wallNormal).normalized; _motor.ForceUnground(); @@ -189,13 +202,13 @@ namespace Code.Gameplay.Character.Controller.Abilities { if (!IsWallRunning || !_motor) return; - if (_motor.CharacterController is not CustomCharacterController controller || !controller.CanJump) + if (_motor.CharacterController is not CustomCharacterController { CanJump: true } controller) return; IsWallRunning = false; var wallAway = _wallNormal; - var wallUp = _wallTangentUp; + var wallUp = Vector3.ProjectOnPlane(_motor.CharacterUp, _wallNormal).normalized; var playerForward = cameraRotation * Vector3.forward; @@ -204,8 +217,8 @@ namespace Code.Gameplay.Character.Controller.Abilities var jumpDirection = forwardInWallPlane * 0.2f + - wallAway * 0.4f + - wallUp * 0.4f; + wallAway * 0.6f + + wallUp * 0.2f; jumpDirection = jumpDirection.normalized;