namespace Code.Interfaces
{
public interface IStateBase
{
void StateUpdate();
void ShowIt();
}
}
using UnityEngine;
using Code.States;
using Code.Interfaces;
public class StateManager : MonoBehaviour {
private IStateBase activeState;
[HideInInspector]
public GameData gameData;
[HideInInspector]
public StatTracker statTracker;
private static StateManager instanceRef;
void Awake()
{
// Singleton for StateManager instance
if (instanceRef == null) {
instanceRef = this;
DontDestroyOnLoad (gameObject);
} else {
DestroyImmediate (gameObject);
}
}
void Start () {
activeState = new MainMenuState (this);
statTracker = GetComponent<StatTracker> ();
gameData = GetComponent<GameData> ();
}
void Update ()
{
if (activeState != null)
activeState.StateUpdate ();
}
void OnGUI()
{
if (activeState != null)
activeState.ShowIt ();
}
public void SwitchState(IStateBase newState)
{
activeState = newState;
}
public void Restart() {
activeState = new MainMenuState (this);
}
public void Quit() {
Application.Quit ();
}
}
using UnityEngine;
using Code.Interfaces;
using UnityEngine.SceneManagement;
namespace Code.States
{
public class MainMenuState : IStateBase
{
private StateManager manager;
private StatTracker statTracker;
private Scene scene;
public MainMenuState (StateManager managerRef)
{
manager = managerRef;
statTracker = GameObject.Find ("GameManager").GetComponent<StatTracker> ();
statTracker.ResetAllStats ();
if(scene.name != "MainMenu")
SceneManager.LoadScene("MainMenu");
}
public void StateUpdate()
{
if (Input.GetKey ("escape"))
{
Application.Quit();
}
Time.timeScale = 0;
}
public void ShowIt()
{
GUI.DrawTexture (new Rect (0, 0, Screen.width, Screen.height),
manager.gameData.beginStateSplash,
ScaleMode.StretchToFill);
if (GUI.Button(new Rect(10, 10, 150, 100), GlobalValues.startGame))
{
manager.SwitchState (new PlayStateLevel1 (manager)); //Change PlayStateLevel number when creating and testing a particular level
Time.timeScale = 1;
}
if (GUI.Button(new Rect(10, 110, 150, 100), GlobalValues.quitGame))
{
manager.Quit();
}
}
}
}
using UnityEngine;
using Code.Interfaces;
using UnityEngine.SceneManagement;
namespace Code.States
{
public class PlayStateLevel1 : IStateBase
{
private StateManager manager;
private GameObject player;
bool paused;
public PlayStateLevel1 (StateManager managerRef)
{
manager = managerRef;
manager.gameData.RestartLevel ();
manager.gameData.paused = false;
manager.statTracker.PlayStateStats ();
//if(Application.loadedLevelName != "Level1")
SceneManager.LoadScene("Level1");
player = GameObject.Find ("Player");
player.transform.position = new Vector3 (.14f, .5f, -5.35f);
//player.rigidbody.Sleep();
}
public void StateUpdate()
{
if ( manager.statTracker.GetLifePoints() <= 0) {
GameData.lose = true;
manager.SwitchState (new WinLoseStateLevel1 (manager));
}
if (manager.statTracker.GetScore() > 3) {
GameData.win = true;
manager.SwitchState (new WinLoseStateLevel1 (manager));
}
manager.gameData.PauseGame ();
}
public void ShowIt()
{
GUI.Box (new Rect (GlobalValues.scoreX, GlobalValues.scoreY, GlobalValues.scoreWidth, GlobalValues.scoreHeight),
string.Format (GlobalValues.score + manager.statTracker.GetScore()));
GUI.Box (new Rect (GlobalValues.lifePointsX, GlobalValues.lifePointsY, GlobalValues.lifePointsWidht, GlobalValues.lifePointsHeight),
string.Format (GlobalValues.lifePoints + manager.statTracker.GetLifePoints()));
GUI.Box (new Rect (GlobalValues.totalScoreX, GlobalValues.totalScoreY, GlobalValues.totalScoreWidht, GlobalValues.totalScoreHeight),
string.Format (GlobalValues.totalScore + manager.statTracker.GetTotalScore()));
if (manager.gameData.paused)
{
if (GUI.Button(new Rect(GlobalValues.resumeGameX, GlobalValues.resumeGameY, GlobalValues.resumeGameWidth, GlobalValues.resumeGameHeight), GlobalValues.resumeGame))
{
Time.timeScale = 1;
manager.gameData.paused = false;
}
if (GUI.Button(new Rect(GlobalValues.mainMenuX, GlobalValues.mainMenuY, GlobalValues.mainMenuWidth, GlobalValues.mainMenuHeight), GlobalValues.mainMenu))
{
manager.Restart();
}
if (GUI.Button(new Rect(GlobalValues.quitGameX, GlobalValues.quitGameY ,GlobalValues.quitGameWidth, GlobalValues.quitGameHeight), GlobalValues.quitGame))
{
manager.Quit();
}
}
}
void ShowMenu ()
{
}
}
}
using UnityEngine;
using Code.Interfaces;
using System;
using System.Text.RegularExpressions;
using UnityEngine.SceneManagement;
namespace Code.States
{
public class WinLoseStateLevel1 : IStateBase
{
private StateManager manager;
private string stringLevel, stringLevelNumber;
private int x, levelNumber;
private float timeLeft;
//private IStateBase pLevel;
public WinLoseStateLevel1 (StateManager managerRef)
{
manager = managerRef;
CalculateLevelNumber ();
timeLeft = GameData.timer;
//Type type = Type.GetType(string.Format("Code.States.{0}", "PlayStateLevel2"));
//pLevel = (IStateBase)System.Activator.CreateInstance(type, manager);
//pLevel.manager = manager;
//Debug.Log (pLevel);
}
public void StateUpdate()
{
timeLeft -= Time.deltaTime;
}
void CalculateLevelNumber ()
{
stringLevel = SceneManager.GetActiveScene().name;
stringLevelNumber = Regex.Match(stringLevel, @"\d+").Value; //extract number from string
x = Int32.Parse(stringLevelNumber); // convert string to int
x += 1;
stringLevelNumber = x.ToString(); //convert int to string
stringLevel = GlobalValues.goToLevel + stringLevelNumber;
}
public void ShowIt()
{
// Show Splash Image in the center of the screen, with Height axis a bit above the center
// GUI.DrawTexture (new Rect ((Screen.width/2) - (400/2), (Screen.height/2) - (500/2), 400, 200), manager.gameDataRef.wonStateSplash, ScaleMode.ScaleToFit);
if (GameData.win) {
GUI.DrawTexture (new Rect ((Screen.width / GlobalValues.divider) - (GlobalValues.splashImageXPosition / GlobalValues.divider),
(Screen.height / GlobalValues.divider) - (GlobalValues.splashImageYPosition / GlobalValues.divider),
GlobalValues.splashImageFileWidth, GlobalValues.splashImageFileHeight),
manager.gameData.wonStateSplash, ScaleMode.ScaleToFit);
} else {
GUI.DrawTexture (new Rect ((Screen.width / GlobalValues.divider) - (GlobalValues.splashImageXPosition / GlobalValues.divider),
(Screen.height / GlobalValues.divider) - (GlobalValues.splashImageYPosition / GlobalValues.divider),
GlobalValues.splashImageFileWidth, GlobalValues.splashImageFileHeight),
manager.gameData.lostStateSplash, ScaleMode.ScaleToFit);
}
if (timeLeft < 0) {
if (GameData.win)
{
if (GUI.Button (new Rect (GlobalValues.goToLevelX, GlobalValues.goToLevelY, GlobalValues.goToLevelWidth, GlobalValues.goToLevelHeight), stringLevel)) {
manager.statTracker.SetStat("TotalScore", manager.statTracker.GetScore());
manager.SwitchState (new PlayStateLevel2 (manager));
}
}
if (GUI.Button (new Rect (GlobalValues.playLevelAgainX, GlobalValues.playLevelAgainY, GlobalValues.playLevelAgainWidth, GlobalValues.playLevelAgainHeight), GlobalValues.playLevelAgain)) {
manager.statTracker.RestartLevelStats();
manager.SwitchState (new PlayStateLevel1 (manager));
}
if (GUI.Button (new Rect (GlobalValues.mainMenuX, GlobalValues.mainMenuY, GlobalValues.mainMenuWidth, GlobalValues.mainMenuHeight), GlobalValues.mainMenu)) {
manager.Restart ();
}
if (GUI.Button (new Rect (GlobalValues.quitGameX, GlobalValues.quitGameY, GlobalValues.quitGameWidth, GlobalValues.quitGameHeight), GlobalValues.quitGame)) {
manager.Quit ();
}
}
}
}
}