- Home /
Question by
Bilal_Aljandly · Feb 15 at 08:48 AM ·
rigidbodyplayer movement
rigidbody based character controller
Hi! I makeíng a charater controller rigidboy based! The movement is all great but not when the player tries going up/down slops. When the player walk on a slop, the Y axies velocity goes crazy
Here is my code:
[Header("Needed Components")]
[SerializeField] Rigidbody playerRb;
[SerializeField] CapsuleCollider playerCollider;
[Header("Movement")]
[SerializeField] float walkingSpeed;
[SerializeField] float runningSpeed;
[Header("Jump")]
[SerializeField] float jumpForce;
[SerializeField] GroundChecking groundChecking;
[Header("Stair Climbing")]
[SerializeField] LayerMask layerFilter;
[SerializeField] GameObject lowerRay;
[SerializeField] GameObject upperRay;
[SerializeField] float stepHieght;
[SerializeField] float stepSmooth;
// Input
private MovementInputManger playerInput;
private void OnValidate()
{
// Stair Climbing
upperRay.transform.localPosition = new Vector3(upperRay.transform.position.x, stepHieght, upperRay.transform.position.z);
}
private void Start()
{
playerInput = MovementInputManger.Instance;
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
private void Update()
{
if (playerInput.PlayerJumpedThisFrame())
Jump();
}
private void FixedUpdate()
{
Move();
}
private void Move()
{
float movingSpeed;
if (playerInput.IsRunning())
movingSpeed = runningSpeed;
else
movingSpeed = walkingSpeed;
playerRb.velocity = Vector3.up * playerRb.velocity.y // Y velocity
+ playerCollider.transform.right * movingSpeed * playerInput.GetPlayerMovement().x // X velocity
+ playerCollider.transform.forward * movingSpeed * playerInput.GetPlayerMovement().y; // Z velocity
if (playerRb.velocity.z != 0f || playerRb.velocity.x != 0f)
stepClimb();
}
private void Jump()
{
if (groundChecking.IsGrounded())
{
playerRb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}
}
bool hitLower, hitUpper;
private void stepClimb()
{
if (Physics.Raycast(lowerRay.transform.position, playerCollider.transform.forward, out RaycastHit lowerHit, playerCollider.radius + 0.2f, layerFilter))
{
hitLower = true;
if (!Physics.Raycast(upperRay.transform.position, playerCollider.transform.forward, out RaycastHit upperHit, playerCollider.radius + 0.3f, layerFilter))
{
playerRb.position += new Vector3(0f, stepSmooth, 0f);
hitUpper = true;
}
else hitUpper = false;
}
else
{
hitLower = false;
hitUpper = false;
}
}
private void OnDrawGizmos()
{
if (hitLower)
{
Gizmos.color = Color.green;
Gizmos.DrawLine(lowerRay.transform.position, lowerRay.transform.position + playerCollider.transform.forward * (playerCollider.radius + 0.2f));
}
else
{
Gizmos.color = Color.red;
Gizmos.DrawLine(lowerRay.transform.position, lowerRay.transform.position + playerCollider.transform.forward * (playerCollider.radius + 0.2f));
}
if (hitUpper)
{
Gizmos.color = Color.green;
Gizmos.DrawLine(upperRay.transform.position, upperRay.transform.position + playerCollider.transform.forward * (playerCollider.radius + 0.3f));
}
else
{
Gizmos.color = Color.red;
Gizmos.DrawLine(upperRay.transform.position, upperRay.transform.position + playerCollider.transform.forward * (playerCollider.radius + 0.3f));
}
}
I am kind sure the issue in the move function where i am setting the playerRb velocity, but i have no clue how to fixe it.
I will be greatfull for any help.
Comment
Your answer
Follow this Question
Related Questions
Player keeps falling halfway through terrain floor 3 Answers
Stop rigidbody player from juddering when walking into a wall. 0 Answers
Trying to make a 2d object launch towards the mouse when I left click. can anyone help? 2 Answers
Player is Speeding up in collisions 0 Answers
5.4 broke rigidbody.addForce? 0 Answers