using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class GameManager : MonoBehaviour
{
public GameObject ballPrefab;
public GameObject playerPrefab;
public Text scoreText;
public Text ballsText;
public Text levelText;
public Text highscoreText;
public Text levelCompletedText;
public GameObject panelMenu;
public GameObject panelPlay;
public GameObject panelLevelCompleted;
public GameObject panelGameOver;
public GameObject[] levels;
public static GameManager Instance { get; private set; }
public enum State { MENU, INIT, PLAY, LEVELCOMPLETED, LOADLEVEL, GAMEOVER }
State _state;
GameObject _currentBall;
GameObject _currentLevel;
bool _isSwitchingState;
private int _score;
public int Score
{
get { return _score; }
set
{
_score = value;
scoreText.text = "SCORE : " + _score;
}
}
private int _level;
public int Level
{
get { return _level; }
set {
_level = value;
levelText.text = "NIVEAU : " + _level;
}
}
private int _balls;
public int Balls
{
get { return _balls; }
set
{
_balls = value;
ballsText.text = "BALLES : " + _balls;
}
}
public void PlayClicked()
{
SwitchState(State.INIT);
}
void Start()
{
Instance = this;
SwitchState(State.MENU);
// PlayerPrefs.DeleteKey("highscore"); // On efface le highscore précédent
}
public void SwitchState(State newState, float delay = 0)
{
StartCoroutine(SwitchDelay(newState, delay));
}
IEnumerator SwitchDelay(State newState, float delay = 0)
{
_isSwitchingState = true;
yield return new WaitForSeconds(delay);
EndState();
_state = newState;
BeginState(newState);
_isSwitchingState = false;
}
void BeginState(State newState)
{
switch (newState)
{
case State.MENU:
Cursor.visible = true; // On affiche le curseur souris
highscoreText.text = "MEILLEUR SCORE : " + PlayerPrefs.GetInt("highscore");
panelMenu.SetActive(true);
break;
case State.INIT:
Cursor.visible = false; // On supprime l’affichage du curseur souris
panelPlay.SetActive(true);
Score = 0;
Level = 0;
Balls = 3;
if (_currentLevel != null)
{
Destroy(_currentLevel);
}
Instantiate(playerPrefab);
SwitchState(State.LOADLEVEL);
break;
case State.PLAY:
break;
case State.LEVELCOMPLETED:
Destroy(_currentBall); // On supprime la balle
Destroy(_currentLevel); // On supprime le niveau (on n’a plu besoin de ce GO)
levelCompletedText.text = "NIVEAU " + _level + " TERMINÉ";
// Level++; // On rajoute 1 à niveau
panelLevelCompleted.SetActive(true); // On affiche Niveau x Terminé
SwitchState(State.LOADLEVEL, 2f); // On passe à l’état de prochain niveau dans 2 s
break;
case State.LOADLEVEL:
if (Level >= levels.Length)
{
SwitchState(State.GAMEOVER);
}
else
{
_currentLevel = Instantiate(levels[Level]);
SwitchState(State.PLAY);
}
break;
case State.GAMEOVER:
if (Score > PlayerPrefs.GetInt("highscore")) // Si score > à l’info highscore dans le registry de Windows et autres plateformes
{
PlayerPrefs.SetInt("highscore", Score);
}
panelGameOver.SetActive(true);
break;
}
}
void Update()
{
switch (_state)
{
case State.MENU:
break;
case State.INIT:
break;
case State.PLAY:
if (_currentBall == null)
{
if (Balls > 0)
{
_currentBall = Instantiate(ballPrefab);
}
else
{
SwitchState(State.GAMEOVER);
}
}
if (_currentLevel != null && _currentLevel.transform.childCount == 0 && !_isSwitchingState) // On compte le transform des enfants du Level (càd les briques : astuce !)
{
SwitchState(State.LEVELCOMPLETED);
}
break;
case State.LEVELCOMPLETED:
break;
case State.LOADLEVEL:
break;
case State.GAMEOVER:
if(Input.anyKeyDown) // Si on appuie sur n’importe quelle touche (et même clic souris)
{
SwitchState(State.MENU);
}
break;
}
}
void EndState()
{
switch (_state)
{
case State.MENU:
panelMenu.SetActive(false);
break;
case State.INIT:
break;
case State.PLAY:
break;
case State.LEVELCOMPLETED:
panelLevelCompleted.SetActive(false);
Level++; // On rajoute 1 à niveau
break;
case State.LOADLEVEL:
break;
case State.GAMEOVER:
panelPlay.SetActive(true);
panelLevelCompleted.SetActive(false);
break;
}
}
}