Tazgirl
Tazgirl

Reputation: 83

Unity/C#: Consistency for controllable ball rolling

I created a movable 2D ball character but when it stops moving the ball continues spinning for a bit without moving, how can I fix this?

Here is the existing code:

public class Controller : MonoBehaviour
{
    public float TotalJumpForce;
    public float TotalDropForce;
    public float jumps;
    public float speed;
    public float jumpForce;
    public float dropforce;
    bool isGrounded = false;
    public Transform isGroundedChecker;
    public float checkGroundRadius;
    public LayerMask groundLayer;

    Rigidbody2D rb;

    void Start()
    {
        stalltimer = 1000;
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        TotalJumpForce = rb.velocity.y + jumpForce;
        TotalDropForce = rb.velocity.y + dropforce;
        CheckIfGrounded();
        Move();
        Jump();
        Drop();
    }
    void Move()
    {
        float x = Input.GetAxisRaw("Horizontal");
        float moveBy = x * speed;
        rb.velocity = new Vector2(moveBy, rb.velocity.y);
    }
    void Jump()
    {
        if (Input.GetKeyDown("w"))
        {
            if (jumps > 0)
                    rb.velocity = new Vector2(rb.velocity.x, TotalJumpForce);
                    jumps = jumps - 1;
        }
    }
    void Drop()
    {
        if (Input.GetKeyDown("s"))
        {

            rb.velocity = new Vector2(rb.velocity.x, TotalDropForce);
        }
    }
    void CheckIfGrounded()
    {
        Collider2D collider = Physics2D.OverlapCircle(isGroundedChecker.position, checkGroundRadius, groundLayer);
        if (collider != null)
        {
            isGrounded = true;
            jumps = 2;
            stalls = 3;
        }
        else
        {
            isGrounded = false;
        }
    }

}

Changing angular and linear drag doesn't make a difference. Changing the gravity scale doesnt seem to make a diffrence either.

Upvotes: 0

Views: 40

Answers (1)

derHugo
derHugo

Reputation: 90679

You could check for input and reset the rb.angularVelocity in case there is no input

void Move()
{
    var x = Input.GetAxisRaw("Horizontal");
    var moveBy = x * speed;
    rb.velocity = new Vector2(moveBy, rb.velocity.y);

    if(Mathf.Approximately(move, 0f))
    {
        rb.angularVelocity = 0;
    }
}

Upvotes: 1

Related Questions