diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity index 2308c68..fe60076 100644 --- a/Assets/Scenes/SampleScene.unity +++ b/Assets/Scenes/SampleScene.unity @@ -631,11 +631,12 @@ MonoBehaviour: m_SlideDrag: 3 m_SlideSpeed: 10 m_JumpForce: 20 - m_WallRunSpeed: 10 + m_WallRunSpeed: 15 m_WallCheckDistance: 1.5 m_DistanceOfFloorToWallRide: 0.1 m_JumpKey: 32 m_SlideKey: 99 + m_WallRunKey: 304 m_Body: {fileID: 1174770952} m_Orientation: {fileID: 166780449} m_PlayerTransform: {fileID: 1174770951} diff --git a/Assets/Scripts/Player/PlayerMovement.cs b/Assets/Scripts/Player/PlayerMovement.cs index 7ae8133..aec253a 100644 --- a/Assets/Scripts/Player/PlayerMovement.cs +++ b/Assets/Scripts/Player/PlayerMovement.cs @@ -65,6 +65,10 @@ public partial class PlayerMovement : MonoBehaviour // Timer for slide boost duration left int m_TicksOfSlideBoostLeft = 0; + // Wall riding trackers + bool m_FirstFrameWallRiding = true; + bool m_FlippedWallRideDirectionFirstFrame = false; + // Raycast hit objects RaycastHit m_GroundHit; RaycastHit m_SlopeHit; diff --git a/Assets/Scripts/Player/PlayerState.cs b/Assets/Scripts/Player/PlayerState.cs index 5031e2e..aa874b3 100644 --- a/Assets/Scripts/Player/PlayerState.cs +++ b/Assets/Scripts/Player/PlayerState.cs @@ -40,6 +40,10 @@ public partial class PlayerMovement : MonoBehaviour StopSlide(); break; + case PlayerState.WALL_RUNNING: + m_FirstFrameWallRiding = true; + break; + default: break; } diff --git a/Assets/Scripts/Player/WallRunningMovement.cs b/Assets/Scripts/Player/WallRunningMovement.cs index d0d5f99..67addb7 100644 --- a/Assets/Scripts/Player/WallRunningMovement.cs +++ b/Assets/Scripts/Player/WallRunningMovement.cs @@ -10,7 +10,7 @@ public partial class PlayerMovement : MonoBehaviour Collider closest = null; foreach (Collider collision in m_WallCollisions) - { + { Vector3 pos = collision.ClosestPoint(transform.position); Vector3 dif = transform.position - pos; @@ -53,9 +53,21 @@ public partial class PlayerMovement : MonoBehaviour // Calculates the foward direction of the wall Vector3 foward = Vector3.Cross(m_WallNormal, transform.up); - // Flips the foward direction if facing the other direction - if ((m_Orientation.forward - foward).magnitude > (m_Orientation.forward - (-foward)).magnitude) - { foward = -foward; } + if (m_FirstFrameWallRiding == true) + { + // Resets the tracker + m_FirstFrameWallRiding = false; + + // Calculates it should flip the direction of the wall riding depending on the direction the player is looking + bool flip = (m_Orientation.forward - foward).magnitude > (m_Orientation.forward - (-foward)).magnitude; + + // Stores it for all the other frames of the current wall ride + m_FlippedWallRideDirectionFirstFrame = flip; + } + + // Flips the direction if it did the first frame to stop the direction changing mid wall ride + if (m_FlippedWallRideDirectionFirstFrame == true) + { foward = -foward; } // Applies the wall running force to the player m_Body.AddForce(foward * m_WallRunSpeed * m_Body.mass * 10.0f, ForceMode.Force);