Fix for inconsistent jump height?
Basic TPS controller - when I jump whilst standing still, I jump at a consistently different height compared to when I a moving.
Ruled out issues with rigid.drag. One thing I have noticed is that the "y value" on rigid.velocity is fixed at -0.6 and decreases to another fixed amount. I cannot figure out what is causing this decrease and suspect it may be the issue. !
Attempting to set the y value to various different values proved unfruitful as most of the time it affected the jump since it is updated each frame and would be reset whenever moving.
public void FixedTick(float d)
{
delta = d;
playerStates.jumpConfirmed = false;
playerStates.onGround = onGround(); //must be before jump
handleDrag();
jump();
movement();
rotation();
attack();
detectCheck();
Debug.Log(rigid.velocity);
}
void movement()
{
if (inputHandler.inputVariables.horizontal !=0 || inputHandler.inputVariables.vertical != 0)
{
float movementSpeed = 2;
currentVelocity = rigid.velocity;
targetVelocity = inputHandler.inputVariables.moveDirection * movementSpeed;
velocityChange = 3;
Vector3 vel = Vector3.Lerp(currentVelocity, targetVelocity, delta * velocityChange);
rigid.velocity = vel;
}
}
public void jump()
{
if (playerStates.jumpInput && !playerStates.isCrouching)
{
checkForGround = false;
playerStates.jumpConfirmed = true;
rigid.drag = 0;
rigid.velocity = new Vector3(rigid.velocity.x, 0, rigid.velocity.z);
rigid.velocity += Vector3.up * playerValues.jumpHeight;
jumpY += Vector3.up * playerValues.jumpHeight;
StartCoroutine(pauseGroundCheck());
}
}
IEnumerator pauseGroundCheck()
{
yield return new WaitForSeconds(.1f);
Debug.Log("playerHeight" + rigid.worldCenterOfMass.y);
checkForGround = true;
}
bool onGround()
{
if (checkForGround)
{
Vector3 origin = playerTransform.position;
origin.y += 0.6f;
Vector3 dir = -Vector3.up;
float distToGround = 0.6f;
RaycastHit hitGround;
Debug.DrawRay(origin, dir, Color.green, distToGround);
if (Physics.Raycast(origin, dir, out hitGround, distToGround, groundLayer))
{
Vector3 tp = hitGround.point; //target position - where collision has occured
playerTransform.position = tp; //sets mTransform. position to the collision point
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
[1]: /storage/temp/153663-gif.gif
Answer by Camleau · Mar 05, 2020 at 02:41 PM
After hours of trial an error, it is thankfully a simple fix. I'm sure I tried this in various variations before but maybe it was incompatible.
I added the line below just before setting the RigidBody.velocity in my movement function to maintain the current y velocity. My understanding is still incomplete but it fixed my issue and might help someone else:
vel.y = rigid.velocity.y;
Your answer
Follow this Question
Related Questions
Make it so you cant jump in air 0 Answers
While (starting jumping or in jump) holding W key makes game object jump high and fall slow. 1 Answer
Jump logic issues 0 Answers
Change the "jumping speed" in the FirstPersonController by using another script 0 Answers
My jump scripit wont work. i have been tryingtt o make it work for an eternity. please help. 1 Answer