调用不工作的Unity

时间:2014-05-15 10:58:02

标签: unity3d invoke

你能告诉我这段代码有什么问题吗?它不会调用Invoke函数

    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);
    }

}

2 个答案:

答案 0 :(得分:1)

你破坏了那个monobehaviour的游戏对象:

Destroy(gameObject);

如果monobehaviour本身已被破坏,如何调用这些方法?

答案 1 :(得分:0)

当你摧毁一个GameObject时,所有附加的MonoBehaviours'活动调用被取消。这样可以防止错误的引用。

完成调用后,只需销毁GameObject:

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);
    }

}