0

Can you tell me what's wrong in this piece of code? It does not call the Invoke function

    public class ReazioneBonus : MonoBehaviour {

    void OnTriggerEnter(Collider collider){

        string nomeBonus;

        if(collider.gameObject.name.Contains("Pallina")){
            nomeBonus = gameObject.name;
            Debug.Log("bonus colpito");
            Debug.Log("il nome del bonus è " + nomeBonus);

            if(nomeBonus == "PaddleLungo(Clone)"){ //Allunga il paddle per 5 secondi
                Debug.Log("attivazione Paddle Lungo");
                Destroy(gameObject);
                Debug.Log("bonus colpito da " + Pallina.ultimoGiocatoreToccato);
                if(Pallina.ultimoGiocatoreToccato.name == "AvversarioRosso" || Pallina.ultimoGiocatoreToccato.name == "AvversarioVerde"){
                    Debug.Log("giocatore riconosciuto");
                    AllungaPaddleVerticale();
                    Invoke ("RipristinaPadVerticale", 5f); //non chiama la funzione
                }else if(Pallina.ultimoGiocatoreToccato.name == "AvversarioBlu" || Pallina.ultimoGiocatoreToccato.name == "AvversarioGiallo"){
                    Debug.Log("giocatore riconosciuto");
                    AllungaPaddleOrizzontale();
                    Invoke ("RipristinaPadOrizzontale", 5f); //non chiama la funzione
                }
            }
        }
    }


    void AllungaPaddleVerticale(){
        Pallina.ultimoGiocatoreToccato.transform.localScale += new Vector3(3F, 0, 0);
    }

    void AllungaPaddleOrizzontale(){
        Pallina.ultimoGiocatoreToccato.transform.localScale += new Vector3(0, 0, 3F);
    }

    void RipristinaPadVerticale(){
        Debug.Log("ripristino il paddle");
        Pallina.ultimoGiocatoreToccato.transform.localScale += new Vector3(-3F, 0, 0);
    }

    void RipristinaPadOrizzontale(){
        Debug.Log("ripristino il paddle");
        Pallina.ultimoGiocatoreToccato.transform.localScale += new Vector3(0, 0, -3F);
    }

}
Jehof
  • 34,674
  • 10
  • 123
  • 155
user3637284
  • 1
  • 1
  • 1

2 Answers2

1

You destroy the gameObject of that monobehavior:

Destroy(gameObject);

How would these methods be invoked if the monobehavior itself is already destroyed?

Max Yankov
  • 12,551
  • 12
  • 67
  • 135
0

When you destroy a GameObject all attached MonoBehaviours' active invokes are cancelled. This to prevent bad references.

Simply destroy the GameObject after your invokes are complete:

public class ReazioneBonus : MonoBehaviour {

    void OnTriggerEnter(Collider collider){

        string nomeBonus;

        if(collider.gameObject.name.Contains("Pallina")){
            nomeBonus = gameObject.name;
            Debug.Log("bonus colpito");
            Debug.Log("il nome del bonus è " + nomeBonus);

            if(nomeBonus == "PaddleLungo(Clone)"){ //Allunga il paddle per 5 secondi
                Debug.Log("attivazione Paddle Lungo");
                Debug.Log("bonus colpito da " + Pallina.ultimoGiocatoreToccato);
                if(Pallina.ultimoGiocatoreToccato.name == "AvversarioRosso" || Pallina.ultimoGiocatoreToccato.name == "AvversarioVerde"){
                    Debug.Log("giocatore riconosciuto");
                    AllungaPaddleVerticale();
                    Invoke ("RipristinaPadVerticale", 5f); //non chiama la funzione
                }else if(Pallina.ultimoGiocatoreToccato.name == "AvversarioBlu" || Pallina.ultimoGiocatoreToccato.name == "AvversarioGiallo"){
                    Debug.Log("giocatore riconosciuto");
                    AllungaPaddleOrizzontale();
                    Invoke ("RipristinaPadOrizzontale", 5f); //non chiama la funzione
                }
            }
        }
    }


    void AllungaPaddleVerticale(){
        Pallina.ultimoGiocatoreToccato.transform.localScale += new Vector3(3F, 0, 0);
    }

    void AllungaPaddleOrizzontale(){
        Pallina.ultimoGiocatoreToccato.transform.localScale += new Vector3(0, 0, 3F);
    }

    void RipristinaPadVerticale(){
        Debug.Log("ripristino il paddle");
        Pallina.ultimoGiocatoreToccato.transform.localScale += new Vector3(-3F, 0, 0);
        Destroy(gameObject);
    }

    void RipristinaPadOrizzontale(){
        Debug.Log("ripristino il paddle");
        Pallina.ultimoGiocatoreToccato.transform.localScale += new Vector3(0, 0, -3F);
        Destroy(gameObject);
    }

}
Nick Udell
  • 2,420
  • 5
  • 44
  • 83