简体   繁体   中英

UNITY : Ball showing odd behaviour

I have a Ball(sphere) and a floor in my game scene. Ball.cs is attached to the ball to control its movement in the game(Ball only moves in the vertical direction). Both Ball and floor have colliders attached to them and whenever ball touches the floor, the game should ideally end.

OnCollisionEnter2D Method from the Ball.cs script.

private void OnCollisionEnter2D(Collision2D collision)
    {
        // Zero out the ball's velocity
        rb2d.velocity = Vector2.zero;
        // If the ball collides with something set it to dead...
        isDead = true;
        //...and tell the game control about it.
        GameController.instance.PlayerDied();
    }

Update function

    void Update () {

    //Don't allow control if the bird has died.
    if (isDead == false)
    {
        //Look for input to trigger a "flap".
        if (Input.GetMouseButtonDown(0))
        {

            //...zero out the birds current y velocity before...
            rb2d.velocity = Vector2.zero;
            //  new Vector2(rb2d.velocity.x, 0);
            //..giving the bird some upward force.
            rb2d.AddForce(new Vector2(0, upForce));
        }
    }


}

But what's happening is whenever ball touches the ground, it starts rolling on the ground. It moves few units on +X-axis then rolls back and then ultimately stops.

在此处输入图片说明

position.X should ideally be 0(as the ball is moving only in Y-axis and it is during the game) but as soon as ball collides with the floor it starts moving.

I am new to Unity and I have no idea what is wrong.

Why is this happening?

EDIT : Programmer's answer does work but I still don't understand where the horizontal velocity is coming from(there is horizontal velocity component associated with the ball). I need to know why ball is moving in horizontal direction.

I noticed that you are setting isDead to true when collision happens. If you don't want the ball to move again then set velocity to Vector2.zero; in the Update not only in the OnCollisionEnter2D function. Do this only if isDead is true.

void Update()
{
    if (isDead)
    {
        rb2d.velocity = Vector2.zero;
    }
}

Another option is to freeze the constraints when the collision happens. If you want the ball to start rolling again then unfreeze it.

private void OnCollisionEnter2D(Collision2D collision)
{
    //Zero out the ball's velocity
    rb2d.velocity = Vector2.zero;

    //Freeze constraints
    rb2d.constraints = RigidbodyConstraints2D.FreezeAll;

    // If the ball collides with something set it to dead...
    isDead = true;
    //...and tell the game control about it.
    GameController.instance.PlayerDied();
}

Execute rb2d.constraints = RigidbodyConstraints2D.None; to unfreeze it after.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM