Kevin H
Kevin H

Reputation: 113

Unity text not updating (lives counter)

I am trying to update the lives of my player in a brick breaker game, however I find myself unable to update the text UI responsible for displaying the score (it always displays 3 lives remaining). Is there any way to fix this issue?

Here is the relevant code

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

public class GameManager : MonoBehaviour
{
    // Start is called before the first frame update
    int lives;
    public bool isDead;
    public GameObject[] bricks;
    int numberBricks;
    public Text livesText;

   
    private void Start()
    {
        isDead = false;
        lives = 3;
        livesText.text = "lives left: " + lives.ToString();
        Debug.Log(lives);
        
    }

    // Update is called once per frame
    void Update()
    {
        livesText.text = "lives left: " + lives.ToString();
        numberBricks = GameObject.FindGameObjectsWithTag("brick").Length;
        if (numberBricks == 0) {
            passLevel();
        }
    }
    private void passLevel() {

    }
    public void ReduceHealth() {
        lives--;
        Debug.Log(lives);


    }
    public void CheckDeath() {
        if (lives == 0) {
            isDead = true;
        }
    }
}







the ReduceHealth() function is called at

Ball.cs 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Ball : MonoBehaviour
{
    // Start is called before the first frame update
    Vector3 Direction;
    int speedFactor;
    float minX;
    float maxX;
    float additionalForce;
    Rigidbody2D rb;
    public GameObject paddle;
    public AudioSource collisionSound;
    public GameObject gameManager;
    GameManager gm;

   
    void Start()
    {
        float sign = Mathf.Sign(Random.Range(-1,1));
        minX = -10f * sign;
        maxX = -2f * sign;

        Direction.x = Random.Range(minX,maxX) ;
        Direction.y = -40f;
        speedFactor = 1;
        
        rb = GetComponent<Rigidbody2D>();
        gm = gameManager.GetComponent<GameManager>();


    }
    // Update is called once per frame
    void Update()
    {
       transform.position += Direction * speedFactor * Time.deltaTime;
    }  

    void Reset() {
        transform.position = new Vector3(0.14f,-4.58f,0f);
    }
    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.gameObject.tag == "Player" || other.gameObject.tag == "border-vertical") {
            Direction.y *=-1;
        } else if(other.gameObject.tag=="border-bottom") {
            gm.ReduceHealth();
            Reset();
        }else {
            Direction.x *= -1;
        }
    


    }
}


and here is the Screenshot of my inspector (GameManager object)

enter image description here

any help would be appreciated.

Upvotes: 0

Views: 892

Answers (1)

Geeky Quentin
Geeky Quentin

Reputation: 2508

It looks like the function ReduceHealth() has no references. I created a button to see if the lives are reduced or not, it's working. Here is an attached image of OnClick() in button inspector

A few tips

  • It is not a good practice to update the text in Update function, instead do it in the function where the value of lives is changing. Also check if the lives == 0 in the same function only, there is no need for the function CheckDeath().

     public void ReduceHealth() {
         lives--;
         livesText.text = "lives left: " + lives.ToString();
    
         if (lives == 0) {
             isDead = true;
         }
     }
    
  • It is also not a good practice to keep checking the length of the number of bricks at every frame, instead have a check for it in whichever function the breaking of bricks is dealt with.
    For eg when the health of the brick reaches zero, get a reference to the GameManager script and do the length check there.

Upvotes: 1

Related Questions