Project 2 - Starter Code
Starter Code:
These code file are included in the Project 2 Starter Assets
StateManager.cs
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.SceneManagement;
///
/// CS2335 - Spring 2020
///
/// <summary>
/// Game Scene. Matches Unity Scenes in Build Settings
/// YOU WILL ADD CODE FOR YOUR SCENES HERE
/// Scene Enums must match your Unity Scene Name
/// </summary>
public enum GameScene
{
BeginScene = 0,
EndScene = 1
}
/// <summary>
/// State manager. Add comments
/// </summary>
public class StateManager : MonoBehaviour
{
public static StateManager instanceRef;
public IStateBase activeState;
public GameScene curScene;
/// <summary>
/// Create this singleton instance.
/// Implement the Singleton Design Pattern - initialize managerInstance
/// </summary>
void Awake()
{
if (instanceRef == null)
{
instanceRef = this;
DontDestroyOnLoad(gameObject); //the gameObject this is attached to
}
else
{ //
DestroyImmediate(gameObject);
Debug.Log("Destroy GameObject");
}
}
// Use this for initialization
void Start()
{
activeState = new BeginState(); //must customize for your game
curScene = activeState.Scene;
activeState.InitializeObjectRefs(); //call to Initialize BeginState object references
//next scene change - this event will call OnLevelFinishedLoading custom function
SceneManager.sceneLoaded += OnLevelFinishedLoading; //add function to sceneLoaded delegate
}
/// <summary>
/// Switchs the state.
/// </summary>
/// <param name="newState">New state.</param>
public void SwitchState(IStateBase newState)
{
activeState = newState;
curScene = newState.Scene; //set scene based on newState's GameScene enum
SceneManager.LoadScene(curScene.ToString()); //Use scene name
//SceneManager.LoadScene( (int) curScene); //use Scene ID
Debug.Log("Switch Scene/State to: " + curScene );
}
//Public method to switch state using nextScene enum
public void SwitchState( GameScene nextScene )
{
switch (nextScene)
{
case GameScene.BeginScene:
SwitchState(new BeginState());
break;
case GameScene.EndScene:
SwitchState(new EndState());
break;
default:
Debug.Log("No match on SwitchState - scene " + nextScene);
break;
} //end switch-block
} //end SwitchState
//StateManager needs to know when a new scene has been loaded
//then it can call: InitializeObjectRefs for the current state
void OnLevelFinishedLoading(Scene scene, LoadSceneMode mode)
{
int sceneID = scene.buildIndex;
if (sceneID == (int)curScene)
{
Debug.Log("New function in StateManager to initialize new scene objects - exectued");
activeState.InitializeObjectRefs();
}
else
{
Debug.Log("Big Problems - Scene & State Mismatch");
Debug.Log("LevelFinished Loading :Scene Loaded: " + sceneID + " ActiveState Scene Enum: " + activeState.Scene);
}
}
} //end class StateManager
IStateBase.cs
using UnityEngine;
using System.Collections;
///
/// CS2335 - Spring 19
///
/// <summary>
/// I state base.
/// Interface for all StateX.cs classes
/// </summary>
public interface IStateBase
{
/// <summary>
/// Gets the scene number - enum
/// </summary>
/// <value>The scene.</value>
GameScene Scene
{ // Inteface Property
get; //read-only
}
//all interface methods are public by default!
///<summary>
/// Similar to Unity Start()
/// exectued once, after scene is loaded - called from StateManager
/// Used to initialize object references - can be used to cache object references
/// </summary>
void InitializeObjectRefs();
} //end Interface: IStateBase
BeginState.cs
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.SceneManagement; //add to all State Files
public class BeginState : IStateBase
{
/// <summary>
/// The scene.
/// </summary>
private GameScene scene;
/// <summary>
/// Gets the scene number - enum
/// </summary>
/// <value>The scene.</value>
public GameScene Scene
{
get { return scene; }
}
//GameScene objectRefs
private Button optionBtn1, optionBtn2;
/// <summary>
/// Initializes a new instance of the <see cref="BeginState"/> class.
/// </summary>
public BeginState()
{
scene = GameScene.BeginScene; //IMPORTANT: make sure this matches Unity Scene Name
}
/// <summary>
/// Similar to Unity Start()
/// exectued once, after scene is loaded - called from StateManager
/// Used to initialize object references - can be used to cache object references
/// </summary>
public void InitializeObjectRefs()
{
optionBtn1 = GameObject.Find("ButtonOption1").GetComponent<Button>();
optionBtn1.onClick.AddListener(LoadEndScene);
Debug.Log("Initialize Refs - BeginState");
}
/// <summary>
/// Event handler - called when endBtn is clicked
/// Loads the end scene.
/// public method can be executed by button onClick event
/// </summary>
public void LoadEndScene()
{
Debug.Log("Leaving BeginScene going to EndScene");
StateManager.instanceRef.SwitchState(GameScene.EndScene);
}
} //end class BeginState
EndState.cs
Example code for a Scene_X_State class
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.SceneManagement; //add to all State Files
public class EndState : IStateBase
{
private GameScene scene;
//add commenets
public GameScene Scene
{
get { return scene; }
}
//GameScene objectRefs
private Button optionBtn1, optionBtn2;
//constructor // add comments
public EndState()
{
scene = GameScene.EndScene;
}
//Like Start() - executed once when scene is first loaded
public void InitializeObjectRefs()
{
optionBtn1 = GameObject.Find("ButtonOption1").GetComponent<Button>();
optionBtn1.onClick.AddListener(LoadBeginScene);
Debug.Log("InitializeObj Refs - EndState");
}
public void LoadBeginScene()
{
Debug.Log("Leaving EndScene, going to BeginScene");
StateManager.instanceRef.SwitchState(GameScene.BeginScene);
}
} //end class: EndState
Last updated