> For the complete documentation index, see [llms.txt](https://kdoore.gitbook.io/cs2335/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kdoore.gitbook.io/cs2335/cs2335_f20/project-2-statemanager/project-2-text-adventure-1/project-2-list-of-steps.md).

# Project 2 - List of Steps

Below is an listing of steps for implementing Scene-Change logic for Project2.

The link below gives more detailed information for Gitbook: [Create new scene, state](/cs2335/cs2335_f20/project-2-statemanager/project-2-text-adventure-1/project-2-create-new-scene-and-state.md)

1. Create a total of 5 scenes (MiniGame counts as one of your scenes)

2. For each scene: add scene to the Unity Build Settings

3. Add UI Canvas in Scene
   * Configure: Screen-Space Camera
   * Set camera to: MainCamera

4. Add UI-Text to create a **Scene Label** to identify the scene

5. Add Unique Background Image to each Scene

6. Add **2 Buttons**, to jump to other scenes&#x20;
   1. Recommendation: make a DecisionPanel prefab: panel w/2 Buttons&#x20;

7. Add new scenes to StateManager.cs **GameScene enums**

8. Add new **Scene/State** logic to **StateManager in SwitchState( GameScene nextScene )**&#x20;

   * &#x20;**`case SomeScene:`**

     &#x20;    **`SwitchState(new NextState() );`**
   * **`break;`**

9. Create a new SomeStates.cs classes, add code so it is similar to BeginState.cs
   * Modify code in SomeScene.cs
   * Add code for IStateBase interface:
   * **`GameScene Scene`**
   * **`InitializeObjectRefs( ){ }`**
   * Constructor:
     * public **`SomeScene( ){   }`**
     * &#x20;scene = GameScene.someScene;

10. Modify BeginState - Add UI-Button and code for button-logic to go to SomeScene

    * Define object-reference variable: **Button optionBtn1, optionBtn2**
    * Initialize variable in: **`InitializeObjectRefs( );`**
    * Create custom method for each Button's onClick event:&#x20;
      * **`public void LoadSomeScene( ){  }`**
    * Configure using similar code in  BeginState.cs for **`LoadEndScene( )`**
    * 1 line of code for to switching scene/state&#x20;
      * **`StateManager.instanceRef.SwitchState(GameState.EndScene);`**&#x20;
      *

11. Dialog:  Choose a Dialog script and create a Dialog Prefab&#x20;
    * SimpleDialog.cs -&#x20;
      * does not use ScriptableObject for Conversation Data
      * Prefab does not include character image
    * DialogManager.cs
      * ScriptableObject in Assets for each Conversation
      * Prefab w/Image&#x20;
      * Co-routine - displays dynamic typing text

12. Dialog - Add Dialog to Every Scene except the MiniGame

## Troubleshooting Issues - Scene Change

**1. StartGame in BeginScene** The most important thing to check is that you're always starting your game in the BeginScene. Otherwise, the StateManager will have incorrect code executing, because we hard-coded the starting state in StateManager to be the BeginState.

If it’s a button to jump scenes that’s not working, then there are several things to check.

**Check the console** when you run the project, if you have any errors, that's good, that is where to start.

There are 2 types of errors you may get.

**Console Message:** **BIG PROBLEMS** - scene state mismatch.

These are the things to check:

* **Unity Build Settings** Open the [Unity build settings](https://kdoore.gitbooks.io/cs-2335/content/project-2-create-new-scene-and-state.html#important-add-scenes-in-unity-build-settings) (file >Build Settings), look at the scene ID’s, compare with the&#x20;

### Details:  StateManager:  Add Logic

**GameScene enums in StateManager**, these must match with **Build Setting Scenes in Build.**

```java
public enum GameScene
{
BeginScene = 0,
Scene2 = 1,
MiniGame =2,
Scene3 = 3,
EndScene = 4
}
```

### StateManager.SwitchState( GameScene nextScene)

Add logic to Switch-case statement for changing to the nextScene

```java
//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;

//ADD ADDITIONAL LOGIC HERE For Custom Scene/State Logic

            default:
                Debug.Log("No match on SwitchState - scene " + nextScene);
                    break;
        } //end switch-block
    } //end SwitchState


```

### SceneXState.cs - StateX Class Files - Implements IStateBase

* &#x20;**SceneXState.cs Constructor** within a SceneXState.cs file. In the constructor, you need to set the scene correctly, example:

```java
public SceneXState(){
     scene = GameScene.SceneX; //Scene-State Mismatch Error if incorrect
     }
```

* &#x20;**Button Logic** in the SceneXState file that you are trying to leave from - prior to the error:  BIG PROBLEMS comment.

Make sure that: logic is correct for the button event: the scene / state must match. the LoadScene( "SceneName" ) matches the SwitchState( new StateName( ));

```java
  public void LoadScene2()
    {
        Debug.Log("Leaving BeginState going to Scene2State");
        StateManager.instanceRef.SwitchState(GameScene.Scene2); //pass to StateManager
    }
```

* **Button Initialization Logic Error:** &#x20;

  In the code below, there's a mistake because all logic is being added to the btnOption1.onClick method.  Look for these types of errors.

```java
public void InitializeObjectRefs()
    {
        btnOption1 = GameObject.Find("ButtonOption2").GetComponent<Button>();
        btnOption1.onClick.AddListener(LoadEndScene);

        btnOption2 = GameObject.Find("ButtonOption1").GetComponent<Button>();
        btnOption1.onClick.AddListener(LoadScene2); //ERROR HERE

        Debug.Log("BeginState InitializeObjRefs");
    }
```
