Quel est le problème avec ma coroutine Respawn?


19

Je crée un jeu de plateforme 2D dans lequel si le joueur tombe de la base / du sol, je veux que le joueur réapparaisse au point de contrôle le plus proche. Cependant, je veux qu'il y ait un délai entre le joueur qui tombe du sol et la réapparition. Voici la section de mon code pour atteindre cet objectif:

private void OnTriggerEnter2D(Collider2D collision)
{
    Debug.Log(collision.tag);
    if (collision.tag.Equals("Kill")) 
    {
        StartCoroutine("Respawn");
    }
    else if(collision.tag.Equals("Checkpoint"))
    {

        Animator flag = collision.GetComponent<Animator>();
        if (!flag.GetBool("hasCrossed"))
        {
            flagCounter++;
            flag.SetBool("hasCrossed", true);
            checkpoint = collision.gameObject.transform.position;
        }
    }
}

IEnumerator Respawn()
{
    yield return new WaitForSeconds(respawnDelay);
    transform.position = checkpoint;

}

Cela fonctionne bien pour les petits retards de réapparition comme 1 ou 2 secondes. Mais en augmentant le délai à 5 secondes, le joueur après être apparu au point de contrôle le plus proche disparaît en un instant, puis après plusieurs répétitions, le joueur réapparaît.

C'est pour le délai de 2 secondes C'est pour le délai de 2 secondes

C'est pour le délai de 5 secondes C'est pour le délai de 5 secondes

Comment puis-je réparer cela?


3
Aimez les captures d'écran animées!
Konerak

1
également connu sous le nom de gifs
user1306322

Réponses:


49

Cela ne semble avoir rien à voir avec la façon dont vous configurez la coroutine. Ce qui se passe probablement, c'est que le joueur obtient une accélération suffisamment élevée en tombant pour passer devant le sol et le collisionneur de retombées. Lorsque vous déplacez la position pendant la réapparition, elle chutera toujours au même rythme. Dans votre méthode Respawn, quelque temps après votre ligne d'attente, réglez le dos de vitesse à zéro: GetComponent<Rigidbody2D>().velocity = Vector2.zero.


2
Les bugs de jeu sont géniaux xD
Tom

11
Plus généralement, vous devez réinitialiser autant l'état de votre personnage que vous en avez besoin en plus de la position. Comme la santé, les MP, les munitions, etc. N'oubliez pas de réinitialiser les ennemis ennemis également si c'est ce genre de jeu.
monstre à cliquet

@Joe mais qu'en est-il des ennemis?
David Starkey

8
En relation: À moins que votre jeu ne soit basé sur la physique, de nombreux plateformes ont une "vitesse de chute maximale" pour permettre des chutes plus contrôlées (et éviter des bugs comme celui-ci).
défie
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.