- Home /
How to stop the countdown timer when I have collected all the coins?
So, I have followed the roll-a-ball tutorial, I also added a countdown timer and give it a C# script so that if you couldn't collect all the coins within the time limit, it will automatically change scene to "Game Over" scene. However, when I collect all the coins, the timer still running. I want to stop the countdown timer when I collect all of the coins so it will prevent the change scene.
This is my PlayerController Script
using System.Collections;
using UnityEngine.UI;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float speed;
public Text countText;
public GameObject winButton;
public GameObject mainMenu;
private Rigidbody rb;
private int count;
void Start()
{
rb = GetComponent<Rigidbody>();
count = 0;
SetCountText();
winButton.SetActive(false);
mainMenu.SetActive(false);
winCards.SetActive(false);
}
void FixedUpdate()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
rb.AddForce(movement * speed);
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("Collectible"))
{
other.gameObject.SetActive(false);
count = count + 1;
SetCountText();
}
}
void SetCountText()
{
countText.text = "COLLECT: " + count.ToString() + "/12";
if (count >= 12)
{
winButton.SetActive(true);
mainMenu.SetActive(true);
winCards.SetActive(true);
}
}
}
and this is my Count down timer script
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
public class TimerEnd : MonoBehaviour
{
public string GameOver;
private float timer = 0f;
private Text timerSeconds;
// Use this for initialization
void Start()
{
timerSeconds = GetComponent<Text>();
}
// Update is called once per frame
void Update()
{
timer += Time.deltaTime;
timerSeconds.text = timer.ToString("f2");
if (timer <= 0)
{
Application.LoadLevel("Game Over");
}
}
}
What should I do? I'm still confused, please give me a clear answer bcs I am still new at this.
THANKYOU
Answer by Casiell · Sep 23, 2018 at 09:05 PM
In your PlayerController create a
public static bool CollectedAll = false;
In Update of TimerEnd write at the beginning:
if(PlayerController.CollectedAll)
return;
Then just set this bool to true when you collect last coin.
Answer by KittenSnipes · Sep 25, 2018 at 09:19 PM
This should get you started. If you need any more help with furthering the script I would be glad to help.
using System.Collections;
using UnityEngine.UI;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float speed;
public Text countText;
public GameObject winButton;
public GameObject mainMenu;
private Rigidbody rb;
private int count;
private bool hasWon = false;
void Start()
{
rb = GetComponent<Rigidbody>();
count = 0;
SetCountText();
winButton.SetActive(false);
mainMenu.SetActive(false);
winCards.SetActive(false);
}
void FixedUpdate()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
rb.AddForce(movement * speed);
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("Collectible"))
{
other.gameObject.SetActive(false);
count = count + 1;
SetCountText();
}
}
void SetCountText()
{
countText.text = "COLLECT: " + count.ToString() + "/12";
if (count >= 12)
{
winButton.SetActive(true);
mainMenu.SetActive(true);
winCards.SetActive(true);
hasWon = true;
}
}
public bool HasWon() {
return hasWon;
}
}
Count down timer script
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
public class TimerEnd : MonoBehaviour
{
public string GameOver;
private float timer = 0f;
private Text timerSeconds;
public PlayerController control;
// Use this for initialization
void Start()
{
timerSeconds = GetComponent<Text>();
if (control == null) {
control = GetComponent<PlayerController>();
}
}
// Update is called once per frame
void Update()
{
if (control.HasWon() == false){
timer += Time.deltaTime;
}
timerSeconds.text = timer.ToString("f2");
if (timer <= 0)
{
Application.LoadLevel("Game Over");
}
}
}