Продолжение движение персонажа после его смерти unity 2d

код:


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    public Rigidbody2D rb;
    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void Update()
    {
        if (die == false)
        {
            Walk();
        }
    }

    private bool horizontalMove = true;
    private void Flip()
    {
        horizontalMove = !horizontalMove;
        Vector3 theScale = transform.localScale;
        theScale.x *= -1;
        transform.localScale = theScale;
    }

    bool die = false;
    public float speed;

    private void Walk()
    {
        rb.mass = 0;
        float movey = Input.GetAxis("Vertical");
        rb.velocity = new Vector2(movey * speed, rb.velocity.y);
        float movex = Input.GetAxis("Horizontal");
        rb.velocity = new Vector2(movex * speed, rb.velocity.x);

        if (die == false)
        {
            if (movex > 0 && !horizontalMove)
            {
                Flip();
            }
            else if (movex < 0 && horizontalMove)
            {
                Flip();
            }
        }
    }

    public int Hp;
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "Enemy")
        {
            Hp--;
            if (Hp == 0)
            {
                Die();
            }
        }
    }

    private void Die()
    {
        die = true;
        Vector3 theScale = transform.localScale;
        if (theScale.x > 0)
        {
            gameObject.transform.Rotate(0, 0, 90);
        }
        else if (theScale.x < 0)
        {
            gameObject.transform.Rotate(0, 0, 270);
        }
        speed = 0;
    }
}

Персонаж продолжает движение только если колайдеры игрока и врага касались паралельно. То есть если игрок "протаранил" врага - игрок остановится и умрет без последующего движения. Я пробовал использовать iskinematic, отключение скрипта, изменение гравитации(0 и 1), а также изменять скорость.


Ответы (2 шт):

Автор решения: WiSeeker

Нужно создать булево поле, которое будет принимать true при контакте с коллайдером врага и false при выходе из коллайдера. Затем в методе OnCollisionEnter2D() отнимать HP только в том случае, если контакт произошёл. Таким образом Вы обезопасите себя от нескольких срабатываний OnCollisionEnter2D() при "таране".

    private bool isCollision;

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "Enemy" 
        && !isCollision)
        {
            isCollision = true;
            Hp--;

            if (Hp == 0)
            {
                Die();
            }
        }
    }

    private void OnCollisionExit2D(Collision2D other)
    {
        isCollision = false;
    }
→ Ссылка
Автор решения: Maxim BR

При смерти измени Time.timeScale = 0, думаю легче всего(останавливает время в игре(ui дальше будет работать))

→ Ссылка