Home > OS >  Scores not updated when collided the second time
Scores not updated when collided the second time

Time:05-13

Im having problem with an endless runner game. The scores are not updating after the first object collided. The script is attached to a prefab object. After the first object collided, the score updated to 100, the second object collides, no change.

    void Start()
    {
        player = GameObject.FindGameObjectWithTag("Gameship");
        YourScore = GameObject.Find("Score").GetComponentInChildren<TextMeshProUGUI>();
    }
    void Update()
    {

    }
 
    void OnTriggerEnter2D(Collider2D collision)
    {   
        
        if (collision.tag == "Border")
        {
            Destroy(this.gameObject);
        }
        else if(collision.tag == "Gameship")
        {
            if(this.gameObject.tag == "Reward")
            {
            Destroy(this.gameObject);
            ChangeScore(100);
            }
        }
        
    }
    void ChangeScore(int changeValue)
    {
        this.score  = changeValue;
        YourScore.text = score.ToString();
    }
}

CodePudding user response:

Assuming your score is starting from zero i.e. score = 0, after colliding with Reward tagged gameObject, your code does the following:

  1. The Score increases i.e. score = 100 -> score = 100
  2. Updates the text. text = "100"
  3. GameObject gets destroyed.

On destruction of gameObject, your score variable also gets destroyed, assuming you are instantiating this object again, the whole script is executed again means score = 0, hence doing the above 3 steps over again and setting the text to 100 again which it already is.

I would suggest to use a Singleton class or just store the score variable in a different script that is not getting destroyed.

CodePudding user response:

Currently you destroy the Object and so the scorevalue after it got triggered. You will need an extra class with a static variable which has a score variable which you increase instead of increasing the local one.

public class ScoreHolder {

   public static long score = 0;

}
void Start() {
    player = GameObject.FindGameObjectWithTag("Gameship");
    YourScore = GameObject.Find("Score").GetComponentInChildren<TextMeshProUGUI>();
}
 
void OnTriggerEnter2D(Collider2D collision) {   
    if (collision.tag == "Border") {
        Destroy(this.gameObject);
    } else if(collision.tag == "Gameship") {
        if(this.gameObject.tag == "Reward") {
            ChangeScore(100);
            Destroy(this.gameObject);
        }
    }
}

void ChangeScore(int changeValue) {
    ScoreHolder.score  = changeValue;
    YourScore.text = score.ToString();
}
  • Related