- Home /
Rigidbody2D velocity changes when moving through a platform collider.
Basic character set up with Rigidbody2D and CircleCollider2D as the ground collider. The CircleCollider2D is on a layer set to only collide with a TileMap layer. The tiles on the TileMap layer have a TilemapCollider2D, Static Rigidbody2D, PlatformEffector2D set to Use One Way, and a CompositeCollider2D with the Geometry Type set to Polygon. (see attached picture)
When the player is moving around and jumping on top of platforms the Velocity.x value stays at (+/-) 5. When jumping through a platform, as soon as the rigidbody enters the platform collider, the Velocity.x jumps to 0. They Velocity.y remains the same and is affected by gravity properly.
Answer by NotEth4n · Apr 28, 2019 at 07:12 PM
Figured it out! I was using the CharacterController2D from Brackeys. The Move function had a line that adjusted the speed of the character when it was crouched. The function also continuously checked above the character to ensure that if something was there, it would force the character to crouch, which slowed the movement speed.
//Move the character
public void Move(float move, bool crouch, bool jump)
{
// If crouching, check to see if the character can stand up
if (!crouch)
{
// If the character has a ceiling preventing them from standing up, keep them crouching
if (Physics2D.OverlapCircle(m_CeilingCheck.position, k_CeilingRadius, m_WhatIsGround))
{
crouch = true;
}
}
//only control the player if grounded or airControl is turned on
if (m_Grounded || m_AirControl)
{
// If crouching
if (crouch)
{
if (!m_wasCrouching)
{
m_wasCrouching = true;
OnCrouchEvent.Invoke(true);
}
// Reduce the speed by the crouchSpeed multiplier
move *= m_CrouchSpeed;
// Disable one of the colliders when crouching
if (m_CrouchDisableCollider != null)
m_CrouchDisableCollider.enabled = false;
}
else
{
// Enable the collider when not crouching
if (m_CrouchDisableCollider != null)
m_CrouchDisableCollider.enabled = true;
if (m_wasCrouching)
{
m_wasCrouching = false;
OnCrouchEvent.Invoke(false);
}
}
// Move the character by finding the target velocity
Vector3 targetVelocity = new Vector2(move * 10f, m_Rigidbody2D.velocity.y);
// And then smoothing it out and applying it to the character
m_Rigidbody2D.velocity = Vector3.SmoothDamp(m_Rigidbody2D.velocity, targetVelocity, ref m_Velocity, m_MovementSmoothing);
// If the input is moving the player right and the player is facing left...
if (move > 0 && !m_FacingRight)
{
// ... flip the player.
Flip();
}
// Otherwise if the input is moving the player left and the player is facing right...
else if (move < 0 && m_FacingRight)
{
// ... flip the player.
Flip();
}
}
// If the player should jump...
if (m_Grounded && jump)
{
// Add a vertical force to the player.
m_Grounded = false;
m_Rigidbody2D.AddForce(new Vector2(0f, m_JumpForce));
}
}
When the character passed through the platforms, this function would detect that there was something above it and slow the speed! For my implementation, I decided that I did not need crouch functionality, so I simply removed everything pertaining to crouching. This resolved the changing velocity issue.