# Project 2 -Steps: Create new Scene and State

This section will provide details for how to create a SceneX and corresponding SceneXState.cs C# file, where these items will be added to a copy of Project1, **rename to Project2**. This assumes you have either downloaded the Proj2 starter-code unity-package, or the Proj2 starter-code assets folder. See: [Starter Assets](../project2-starter-assets)

### Create New Scene, Add Scene to Build Settings

To create a new scene, right-click in the Unity Project / Assets Panel and select the Create > Scene option. Name this scene using a descriptive name according to your project's theme. Next, Add this scene to your project's build settings, following the instructions in the main Project2 page:

## IMPORTANT: Add Scenes in Unity Build Settings

For this project to work, you must first go into your project's Build Settings. (File > Build Settings) You must add all scenes to the Scenes to Build Panel. **Drag the scenes from your assets directly into the Scenes to Build Panel.** **Note the order, and SceneID's on the right side, this must match GameScene Enums in StateManager**, BeginScene must be higher than EndScene in the order, it will have a 0 on the right side of the panel, while EndScene will has ID: 1.

![](https://2944698967-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M0-KLgOacVpbicrqehO%2F-M04eWSVrF1dPNoG3KOs%2F-M04eb0hvuLQ54x5uLCp%2FScreen%20Shot%202019-03-05%20at%2010.52.59%20AM.png?generation=1581716784614303\&alt=media)

![](https://2944698967-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M0-KLgOacVpbicrqehO%2F-M04eWSVrF1dPNoG3KOs%2F-M04eYMD_GlWcUjd89XX%2FScreen%20Shot%202018-02-12%20at%202.40.58%20PM.png?generation=1581716770650771\&alt=media)

**Build Settings with 5 Scenes - shown below**

![](https://2944698967-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M0-KLgOacVpbicrqehO%2F-M04eWSVrF1dPNoG3KOs%2F-M04eb0jiPOusWXoAFhf%2FScreen%20Shot%202019-03-05%20at%2010.49.59%20AM.png?generation=1581716784075033\&alt=media)

### Add GameScene Enum to StateManager.cs script:

```java
/// <summary>
/// Game Scene. Matches Unity Scenes in Build Settings
/// </summary>
public enum GameScene //must match Build Settings Order
{
    BeginScene = 0,
    Scene2 = 1,   
    MiniGame = 2,
    Scene3 = 3,
    EndScene = 4
}
```

### Configure the Canvas to use Screen-Space Camera

[ See: Configure Canvas to use Screen-Space Camera](https://kdoore.gitbooks.io/cs-2335/content/project-1-score-and-ui-elements.html#animation-set-canvas-render-mode-to-screen-space-camera)

### Create a SceneXState.cs Script file to correspond to the new Scene

Create a new C# Script in the scripts folder of your project's asset panel. Name the script so it's obvious this script corresponds to the scene you just created. Then, we'll need to modify the code for this script so that it is similar to the other SceneXState.cs files that were included in the starter code, such as BeginState.

### Change Script Steps:

* **Add 'using' directives for UnityEngine.UI to the top of the script file:**

```java
using System.Collections;
using UnityEngine;
using UnityEngine.UI;   //ADD THIS using directive
```

* **Remove:** MonoBehaviour ( Base-Class )
* **Add:** :IStateBase ( interface )
* **Remove:** Unity Start( ) and Update( ) event functions
* **Add code** for IStateBase Interface,&#x20;
  * **variable:  private GameScene scene;**
  * **property:  public GameScene Scene;**&#x20;
  * **method: public void InitializeObjectRefs( ){  ... }**
* **Add:** **Constructor for the Class   - Sets scene value.**

```java
public class SomeState : IStateBase
{
    /// <summary>
    /// The scene enum associated with this state.
    /// </summary>
    private GameScene scene;

    /// <summary>
    /// Read Only Property gives access to the scene number - enum
    /// </summary>
    /// <value>The scene.</value>
    public GameScene Scene {
        get{ return scene; }
    }

//additional code must be added, see below    
} //end class
```

* Add code for IStateBase, Method:  **InitializeObjectRefs( )**

```java
    /// <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 ()
    {
      //code will be added for initializing object refs for scene buttons
      Debug.Log("In InitializeObjectRefs for SomeState ");
    }
```

* Add **Class Constructor**, and set the corresponding GameScene Enum.

```java
 public SomeState ()
    {
        scene = GameScene.SomeScene;
        Debug.Log("In Constructor for SomeState");
    }
```

## Add A Button in BeginScene to go to the new Scene.

Now you must add buttons to other scenes, and code to other state scripts so you can get to this new scene.

To add a Button to the BeginScene, select: GameObject > UI > Button. Name this button so that it corresponds to the task it will be used for. For example, we can call it: SomeSceneButton

### Add Code to BeginState for the new Button's Function

* Declare Object-Reference Variable for a Button Component

```java
private Button someSceneBtn;
```

* Initialize the object reference in: InitializeObjectRefs( )

```java
public void InitializeObjectRefs ()
    {
        someSceneBtn = GameObject.Find ("SomeSceneButton").GetComponent<Button> ();
        someSceneBtn.onClick.AddListener (LoadSomeScene); //call custom method defined below
        Debug.Log ("In BeginState initializeObjRefs");
    }
```

* Write Custom Method to change scene and state

```java
/// <summary>
    /// Event handler - called when endBtn is clicked
    /// Loads the end scene.
    /// </summary>
    public void LoadSomeScene ()
    {  
        Debug.Log ("Leaving BeginScene going to SomeScene");
          StateManager.instanceRef.SwitchState (GameScene.SomeScene);  //create new state, pass to StateManager
    }
```

* Use the Button to go to the new Scene, Add Images,2 Buttons to each of 5 scenes &#x20;
