# Unit 2

https://learn.unity.com/tutorial/unit-2-introduction?uv=2021.3&amp;pathwayId=5f7e17e1edbc2a5ec21a20af&amp;missionId=5f71fe63edbc2a00200e9de0&amp;projectId=5cdcc312edbc2a24a41671e6#5d1ba822edbc2a002175788d

# Introduction

we will make a top down prototype where you shoot things that come after you, kindof like galiga except in 3d and not at all like galiga XD

# Lesson 2.1 - Player Positioning

<div class="section-wrap_33eSsj8g summary-wrap_2K9D41EG" id="bkmrk-summary-overview%3A-yo"><div class="section-title_sAxfYbvs">Summary</div><div class="summary"><div class="body-wrap_176taP6A render-only_3LFn_jOO architecture_37OsW6cu"><div><div class="DraftEditor-root"><div class="DraftEditor-editorContainer"><span data-offset-key="b0000-0-0" style="font-weight: bold;"><span data-text="true">Overview: </span></span></div><div class="DraftEditor-editorContainer"><div class="" data-block="true" data-editor="editorDescription" data-offset-key="7u2u3-0-0"><div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="7u2u3-0-0"><span data-offset-key="7u2u3-0-0"><span data-text="true">You will begin this unit by creating a new project for your second Prototype and getting basic player movement working. You will first choose which character you would like, which types of animals you would like to interact with, and which food you would like to feed those animals. You will give the player basic side-to-side movement just like you did in Prototype 1, but then you will use if-then statements to keep the Player in bounds. </span></span></div></div><div data-offset-key="6jqsd-0-0">  
</div><div class="" data-block="true" data-editor="editorDescription" data-offset-key="6jqsd-0-0"><div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="6jqsd-0-0"><span data-offset-key="6jqsd-0-0" style="font-weight: bold;"><span data-text="true">Project Outcome:</span></span></div></div><div data-offset-key="c9o34-0-0">  
</div><div class="" data-block="true" data-editor="editorDescription" data-offset-key="c9o34-0-0"><div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="c9o34-0-0"><span data-offset-key="c9o34-0-0"><span data-text="true">The player will be able to move left and right on the screen based on the user’s left and right key presses, but will not be able to leave the play area on either side.  
</span></span></div><div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="c9o34-0-0">  
</div><div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="c9o34-0-0"><span data-offset-key="c9o34-0-0"><span data-text="true">**Materials**  
[<div class="material-icon_2Si7HD9p ifont ifont-lrn_icon_download">  
</div>Prototype 2 - Starter Files.zip  
  ](https://connect-prd-cdn.unity.com/20210507/bfd26de3-a68a-4a16-8cf6-8eacf2bb7f75/Prototype%202%20-%20Starter%20Files.zip)<span data-offset-key="c9o34-0-0"><span data-text="true">Select your Unity version</span></span>  
</span></span></div><div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="c9o34-0-0"><span data-offset-key="c9o34-0-0"><span data-text="true">2021.1 - 2021.3</span></span></div></div></div></div></div></div></div></div>

# 1.Create a new Project for Prototype 2

- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="6ejfl-0-0"><span data-offset-key="6ejfl-0-0"><span data-text="true">Open </span></span><span data-offset-key="6ejfl-0-1" style="font-weight: bold;"><span data-text="true">Unity Hub</span></span><span data-offset-key="6ejfl-0-2"><span data-text="true"> and create an empty “</span></span><span data-offset-key="6ejfl-0-3" style="text-decoration: underline;"><span data-text="true">Prototype 2</span></span><span data-offset-key="6ejfl-0-4"><span data-text="true">” project in your course directory on the correct Unity version. If you forget how to do this, refer to the instructions in </span></span>[<span data-offset-key="6ejfl-1-0" style="text-decoration: underline;"><span data-text="true">Lesson 1.1 - Step 1</span></span>](https://learn.unity.com/tutorial/set-up-your-first-project-in-unity?uv=2018.4&courseId=5cf96c41edbc2a2ca6e8810f&projectId=5caccdfbedbc2a3cef0efe63#5cb7a1acedbc2a10b7261d15)</div>

<div data-offset-key="4qlfs-0-0" id="bkmrk-">  
</div><div data-offset-key="4qlfs-0-0" id="bkmrk--1">  
</div>- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="4qlfs-0-0"><span data-offset-key="4qlfs-0-0"><span data-text="true">Click to download the </span></span>[<span data-offset-key="4qlfs-1-0" style="text-decoration: underline;"><span data-text="true">Prototype 2 Starter Files</span></span>](https://connect-prd-cdn.unity.com/20210507/bfd26de3-a68a-4a16-8cf6-8eacf2bb7f75/Prototype%202%20-%20Starter%20Files.zip?_ga=2.29238268.1186801097.1620052249-59568313.1601905412)<span data-offset-key="4qlfs-2-0"><span data-text="true">, </span></span><span data-offset-key="4qlfs-2-1" style="font-weight: bold;"><span data-text="true">extract</span></span><span data-offset-key="4qlfs-2-2"><span data-text="true"> the compressed folder, and then </span></span><span data-offset-key="4qlfs-2-3" style="font-weight: bold;"><span data-text="true">import</span></span><span data-offset-key="4qlfs-2-4"><span data-text="true"> the .unitypackage into your project. If you forget how to do this, refer to the instructions in </span></span>[<span data-offset-key="4qlfs-3-0" style="text-decoration: underline;"><span data-text="true">Lesson 1.1 - Step 2</span></span>](https://learn.unity.com/tutorial/set-up-your-first-project-in-unity?uv=2018.4&courseId=5cf96c41edbc2a2ca6e8810f&projectId=5caccdfbedbc2a3cef0efe63#5cca0230edbc2a635ca5d6d2)</div>

<div data-offset-key="396ab-0-0" id="bkmrk--2">  
</div><div data-offset-key="396ab-0-0" id="bkmrk--3">  
</div>- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="396ab-0-0"><span data-offset-key="396ab-0-0"><span data-text="true">From the Project window, open the </span></span><span data-offset-key="396ab-0-1" style="font-weight: bold;"><span data-text="true">Prototype 2 </span></span><span data-offset-key="396ab-0-2"><span data-text="true">scene and </span></span><span data-offset-key="396ab-0-3" style="font-weight: bold;"><span data-text="true">delete</span></span><span data-offset-key="396ab-0-4"><span data-text="true"> the SampleScene </span></span></div>

<div data-offset-key="eivkr-0-0" id="bkmrk--4">  
</div><div data-offset-key="eivkr-0-0" id="bkmrk--5">  
</div>- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="eivkr-0-0"><span data-offset-key="eivkr-0-0"><span data-text="true">In the top-right of the Unity Editor, change your </span></span><span data-offset-key="eivkr-0-1" style="font-weight: bold;"><span data-text="true">Layout</span></span><span data-offset-key="eivkr-0-2"><span data-text="true"> from Default to your custom layout</span></span></div>

# 2.Add the 3d assets + first few lines of code

<div id="bkmrk-"></div>1. <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="5gpep-0-0"><span data-offset-key="5gpep-0-0"><span data-text="true">If you want, drag a different </span></span><span data-offset-key="5gpep-0-1" style="font-weight: bold;"><span data-text="true">material</span></span><span data-offset-key="5gpep-0-2"><span data-text="true"> from </span></span><span data-offset-key="5gpep-0-3" style="font-style: italic;"><span data-text="true">Course Library &gt; Materials</span></span><span data-offset-key="5gpep-0-4"><span data-text="true"> onto the Ground object </span></span></div>
2. <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="5gpep-0-0"><span data-offset-key="941fa-0-0"><span data-text="true">Drag 1 </span></span><span data-offset-key="941fa-0-1" style="font-weight: bold;"><span data-text="true">Human</span></span><span data-offset-key="941fa-0-2"><span data-text="true">, 3 </span></span><span data-offset-key="941fa-0-3" style="font-weight: bold;"><span data-text="true">Animals</span></span><span data-offset-key="941fa-0-4"><span data-text="true">, and 1 </span></span><span data-offset-key="941fa-0-5" style="font-weight: bold;"><span data-text="true">Food</span></span><span data-offset-key="941fa-0-6"><span data-text="true"> object into the Hierarchy</span></span></div>
3. <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="5gpep-0-0"><span data-offset-key="78l1o-0-0"><span data-text="true">Rename the character “</span></span><span data-offset-key="78l1o-0-1" style="text-decoration: underline;"><span data-text="true">Player</span></span><span data-offset-key="78l1o-0-2"><span data-text="true">”, then </span></span><span data-offset-key="78l1o-0-3" style="font-weight: bold;"><span data-text="true">reposition</span></span><span data-offset-key="78l1o-0-4"><span data-text="true"> the animals and food so you can see them</span></span></div>
4. <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="5gpep-0-0"><span data-offset-key="1a4c1-0-0"><span data-text="true">Adjust the XYZ </span></span><span data-offset-key="1a4c1-0-1" style="font-weight: bold;"><span data-text="true">scale</span></span><span data-offset-key="1a4c1-0-2"><span data-text="true"> of the food so you can easily see it from above</span></span></div>


1. - <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="4cui9-0-0"><span data-offset-key="4cui9-0-0" style="font-weight: bold;"><span data-text="true">Attach</span></span><span data-offset-key="4cui9-0-1"><span data-text="true"> the script to the Player and open it</span></span></div>
    - <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="4cui9-0-0"><span data-offset-key="2cj96-0-0"><span data-text="true">In your </span></span><span data-offset-key="2cj96-0-1" style="font-weight: bold;"><span data-text="true">Assets</span></span><span data-offset-key="2cj96-0-2"><span data-text="true"> folder, create a “</span></span><span data-offset-key="2cj96-0-3" style="text-decoration: underline;"><span data-text="true">Scripts</span></span><span data-offset-key="2cj96-0-4"><span data-text="true">” folder, and a “</span></span><span data-offset-key="2cj96-0-5" style="text-decoration: underline;"><span data-text="true">PlayerController</span></span><span data-offset-key="2cj96-0-6"><span data-text="true">” script inside</span></span></div>
    - <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="4cui9-0-0"><span data-offset-key="d4f5o-0-0"><span data-text="true">At the top of PlayerController.cs, declare a new</span></span></div>
    - <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="4cui9-0-0"><span data-offset-key="d4f5o-0-0"><span data-text="true"> <span data-offset-key="1a4c1-0-2">\[SerializeField</span></span></span><span data-offset-key="d4f5o-0-0"><span data-text="true"><span data-offset-key="1a4c1-0-2">\]</span></span></span></div>
    - <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="4cui9-0-0"><span data-offset-key="d4f5o-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">private float horizontalInput</span></span></div>
    - <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="4cui9-0-0"><span data-offset-key="5q1m4-0-0"><span data-text="true">In </span></span><span data-offset-key="5q1m4-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">Update()</span></span><span data-offset-key="5q1m4-0-2"><span data-text="true">, set </span></span><span data-offset-key="5q1m4-0-3" style="font-weight: bold; font-style: italic;"><span data-text="true">horizontalInput = Input.GetAxis(“Horizontal”)</span></span><span data-offset-key="5q1m4-0-4"><span data-text="true">, then test to make sure it works in the inspector</span></span></div>
    -

```c#
using UnityEngine;

public class Movement : MonoBehaviour
{
    [SerializeField]
    private float horizontalInput;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        horizontalInput = Input.GetAxis("Horizontal");
    }
}
```

## <span class="step-index_3pnc7n2S">4.</span>Move the player left-to-right

- <span data-offset-key="1a4c1-0-2"><span data-text="true">here we can get our input with this basic code, we use \[SerializeField\] for sanitization and allow us to see the value in the inspection panel to make sure we didn't fck up lol</span></span>
- <span data-offset-key="1c7ce-0-0"><span data-text="true">Declare a new </span></span><span data-offset-key="1c7ce-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">public float speed = 10.0f;</span></span>
- <span data-offset-key="9gnle-0-5" style="font-weight: bold; font-style: italic;"><span data-text="true">here's my code</span></span>

```

using UnityEngine;

public class Movement : MonoBehaviour
{
    [SerializeField]
    private float horizontalInput;
    [SerializeField]
    private float speed = 30.0f;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        horizontalInput = Input.GetAxis("Horizontal");
        transform.Translate(Vector3.right * horizontalInput * Time.deltaTime * speed);
    }
}

```

#### <span class="step-index_3pnc7n2S">5+6.</span> Keep the player inbounds

- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="di3j9-0-0"><span data-offset-key="di3j9-0-0"><span data-text="true">In </span></span><span data-offset-key="di3j9-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">Update()</span></span><span data-offset-key="di3j9-0-2"><span data-text="true">, write an</span></span><span data-offset-key="di3j9-0-3" style="font-weight: bold;"><span data-text="true"> if-statement </span></span><span data-offset-key="di3j9-0-4"><span data-text="true">checking if the player’s left X position is </span></span><span data-offset-key="di3j9-0-5" style="font-weight: bold;"><span data-text="true">less than</span></span><span data-offset-key="di3j9-0-6"><span data-text="true"> a certain value</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="8ub62-0-0"><span data-offset-key="8ub62-0-0"><span data-text="true">In the if-statement, set the player’s position to its current position, but with a </span></span><span data-offset-key="8ub62-0-1" style="font-weight: bold;"><span data-text="true">fixed X location</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="d1vud-0-0"><span data-offset-key="d1vud-0-0"><span data-text="true">Repeat this process for the </span></span><span data-offset-key="d1vud-0-1" style="font-weight: bold;"><span data-text="true">right side </span></span><span data-offset-key="d1vud-0-2"><span data-text="true">of the screen</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="bufca-0-0"><span data-offset-key="bufca-0-0"><span data-text="true">Declare new </span></span><span data-offset-key="bufca-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">xRange</span></span><span data-offset-key="bufca-0-2"><span data-text="true"> variable, then replace the hardcoded values with them</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="3l4co-0-0"><div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="3l4co-0-0"><span data-offset-key="3l4co-0-0"><span data-text="true">Add </span></span><span data-offset-key="3l4co-0-1" style="font-weight: bold;"><span data-text="true">comments</span></span><span data-offset-key="3l4co-0-2"><span data-offset-key="3l4co-0-2"><span data-text="true"> to your code or not lol  
      
    </span></span></span></div></div>```
    
    using UnityEngine;
    
    public class Movement : MonoBehaviour
    {
        [SerializeField]
        private float horizontalInput;
        [SerializeField]
        private float speed = 10.0f;
        [SerializeField]
        private float xRange = 20.0f;
        // Start is called before the first frame update
        void Start()
        {
            
        }
    
        // Update is called once per frame
        void Update()
        {
            if (transform.position.x < -xRange)
            {
                transform.position = new Vector3(-xRange, transform.position.y , transform.position.z);
            }
            if (transform.position.x > xRange)
            {
                transform.position = new Vector3(xRange, transform.position.y, transform.position.z);
            }
            horizontalInput = Input.GetAxis("Horizontal");
            transform.Translate(Vector3.right * horizontalInput * Time.deltaTime * speed);
        }
    }
    
    ```
    
    <div><div class="" data-block="true" data-editor="editorBody_6" data-offset-key="e8r65-0-0"></div></div>

New Functionality

The player can move left and right based on the user’s left and right key presses

The player will not be able to leave the play area on either side  
New Concepts &amp; Skills  
Adjust object scale  
If-statements  
Greater/Less than operators  
Next Lesson, We’ll learn how to create and throw endless amounts of food to feed our animals!  
  
  
now use chat gpt to teach me thing and fix a bug that can occur when you move fast

float clampedX = Mathf.Clamp(desiredpoz.x, -Xrange, Xrange) become the min/max

```
using UnityEngine;
//needed a bit of editing coz cgpt3.5 is stoooooooopid
public class Movement : MonoBehaviour
{
    [SerializeField]
    private float speed = 10.0f;
    [SerializeField]
    private float xRange = 10.0f;
    [SerializeField]
    private float horizontalInput;
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        horizontalInput = Input.GetAxis("Horizontal");

        // Calculate the desired position based on the input
        Vector3 desiredPosition = transform.position + Vector3.right * -horizontalInput * Time.deltaTime * speed;

        // Clamp the desired position within the x range
        float clampedX = Mathf.Clamp(desiredPosition.x, -xRange, xRange);
        desiredPosition = new Vector3(clampedX, desiredPosition.y, desiredPosition.z);
        // Move the object to the clamped position
        transform.position = desiredPosition;
    }
}

```

# 3. Instantiation

<span data-offset-key="b0000-0-0" style="font-style: italic;"><span data-text="true">The first thing we must do is give the projectile some forward movement so it can zip across the scene when it’s launched by the player.</span></span>

#### <span class="step-index_3pnc7n2S">1.</span>Make the projectile fly forwards

- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="d42bt-0-0"><span data-offset-key="d42bt-0-0"><span data-text="true">Create a new “</span></span><span data-offset-key="d42bt-0-1" style="text-decoration: underline;"><span data-text="true">MoveForward</span></span><span data-offset-key="d42bt-0-2"><span data-text="true">” script, </span></span><span data-offset-key="d42bt-0-3" style="font-weight: bold;"><span data-text="true">attach</span></span><span data-offset-key="d42bt-0-4"><span data-text="true"> it to the food object, then open it</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="d42bt-0-0"><span data-offset-key="cct8b-0-0"><span data-text="true">Declare a new </span></span><span data-offset-key="cct8b-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">public float speed</span></span><span data-offset-key="cct8b-0-2"><span data-text="true"> variable</span></span><span data-offset-key="cct8b-0-3" style="font-weight: bold; font-style: italic;"><span data-text="true">;</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="d42bt-0-0"><span data-offset-key="7rsgs-0-0"><span data-text="true">In </span></span><span data-offset-key="7rsgs-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">Update()</span></span><span data-offset-key="7rsgs-0-2"><span data-text="true">, add </span></span><span data-offset-key="7rsgs-0-3" style="font-weight: bold; font-style: italic;"><span data-text="true">transform.Translate(Vector3.forward \* Time.deltaTime \* speed);</span></span><span data-offset-key="7rsgs-0-4"><span data-text="true">, then </span></span><span data-offset-key="7rsgs-0-5" style="font-weight: bold;"><span data-text="true">save</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="d42bt-0-0"><span data-offset-key="5csh1-0-0"><span data-text="true">In the </span></span><span data-offset-key="5csh1-0-1" style="font-weight: bold;"><span data-text="true">Inspector</span></span><span data-offset-key="5csh1-0-2"><span data-text="true">, set the projectile’s </span></span><span data-offset-key="5csh1-0-3" style="font-weight: bold;"><span data-text="true">speed</span></span><span data-offset-key="5csh1-0-4"><span data-text="true"> variable, then test</span></span></div>

```
using UnityEngine;

public class Pizza_gun : MonoBehaviour
{
    public GameObject Ammo;

    public float Weapon_Bullet_Projectile_Speed = 60.0f;
    // Start is called before the first frame update
    void Start()
    {
        Ammo = GetComponent<GameObject>();
    }

    // Update is called once per frame
    void Update()
    {
        transform.Translate(Vector3.forward * Time.deltaTime * Weapon_Bullet_Projectile_Speed);
    }
}

```

- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="256ug-0-0"><span data-offset-key="256ug-0-0"><span data-text="true">Create a new “</span></span><span data-offset-key="256ug-0-1" style="text-decoration: underline;"><span data-text="true">Prefabs</span></span><span data-offset-key="256ug-0-2"><span data-text="true">” folder, drag your food into it, and choose </span></span><span data-offset-key="256ug-0-3" style="font-weight: bold;"><span data-text="true">Original Prefab</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="256ug-0-0"><span data-offset-key="bij7d-0-0"><span data-text="true">In PlayerController.cs, declare a new </span></span><span data-offset-key="bij7d-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">public GameObject projectilePrefab;</span></span><span data-offset-key="bij7d-0-2"><span data-text="true"> variable</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="256ug-0-0"><span data-offset-key="5qt98-0-0" style="font-weight: bold;"><span data-text="true">Select</span></span><span data-offset-key="5qt98-0-1"><span data-text="true"> the Player in the hierarchy, then </span></span><span data-offset-key="5qt98-0-2" style="font-weight: bold;"><span data-text="true">drag</span></span><span data-offset-key="5qt98-0-3"><span data-text="true"> the object from your Prefabs folder onto the new </span></span><span data-offset-key="5qt98-0-4" style="font-weight: bold;"><span data-text="true">Projectile Prefab box</span></span><span data-offset-key="5qt98-0-5"><span data-text="true"> in the inspector</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="256ug-0-0"><span data-offset-key="7r56p-0-0"><span data-text="true">Try </span></span><span data-offset-key="7r56p-0-1" style="font-weight: bold;"><span data-text="true">dragging</span></span><span data-offset-key="7r56p-0-2"><span data-text="true"> the projectile into the scene at runtime to make sure they fly</span></span></div>
- <span data-offset-key="7r56p-0-2"><span data-text="true">I added the ammo = get component thing for maybe powerups</span></span>
- <span data-offset-key="d2vg4-0-0"><span data-text="true">In PlayerController.cs, in </span></span><span data-offset-key="d2vg4-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">Update()</span></span><span data-offset-key="d2vg4-0-2"><span data-text="true">, add an </span></span><span data-offset-key="d2vg4-0-3" style="font-weight: bold;"><span data-text="true">if-statement</span></span><span data-offset-key="d2vg4-0-4"><span data-text="true"> checking for a spacebar press: </span></span><span data-offset-key="d2vg4-0-5" style="font-weight: bold; font-style: italic;"><span data-text="true">if (Input.GetKeyDown(KeyCode.Space)) {}</span></span>
- <span data-offset-key="1ktc-0-0"><span data-text="true">Inside the if-statement, add a comment saying that you should </span></span><span data-offset-key="1ktc-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">// Launch a projectile from the player</span></span>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="4lret-0-0"><span data-offset-key="4lret-0-0"><span data-text="true">Inside the if-statement, use the </span></span><span data-offset-key="4lret-0-1" style="font-weight: bold;"><span data-text="true">Instantiate</span></span><span data-offset-key="4lret-0-2"><span data-text="true"> method to spawn a projectile at the player’s location with the prefab’s rotation</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="4lret-0-0"><span data-offset-key="3dc5-0-0" style="font-weight: bold;"><span data-text="true">Select</span></span><span data-offset-key="3dc5-0-1"><span data-text="true"> all three animals in the hierarchy and </span></span><span data-offset-key="3dc5-0-2" style="font-style: italic;"><span data-text="true">Add Component &gt; </span></span><span data-offset-key="3dc5-0-3" style="font-weight: bold; font-style: italic;"><span data-text="true">Move Forward</span></span><span data-offset-key="bir1k-0-0" style="font-weight: bold;"><span data-text="true">Rotate</span></span><span data-offset-key="bir1k-0-1"><span data-text="true"> all animals on the Y axis by </span></span><span data-offset-key="bir1k-0-2" style="font-weight: bold;"><span data-text="true">180 degrees</span></span><span data-offset-key="bir1k-0-3"><span data-text="true"> to face down</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="4lret-0-0"><span data-offset-key="bhouu-0-0"><span data-text="true">Edit their </span></span><span data-offset-key="bhouu-0-1" style="font-weight: bold;"><span data-text="true">speed values</span></span><span data-offset-key="bhouu-0-2"><span data-text="true"> and </span></span><span data-offset-key="bhouu-0-3" style="font-weight: bold;"><span data-text="true">test</span></span><span data-offset-key="bhouu-0-4"><span data-text="true"> to see how it looks</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="4lret-0-0"><span data-offset-key="9et7a-0-0"><span data-text="true">Drag all three animals into the </span></span><span data-offset-key="9et7a-0-1" style="font-weight: bold;"><span data-text="true">Prefabs folder</span></span><span data-offset-key="9et7a-0-2"><span data-text="true">, choosing “Original Prefab”</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="4lret-0-0"><span data-offset-key="3dh7l-0-0" style="font-weight: bold;"><span data-text="true">Test</span></span><span data-offset-key="3dh7l-0-1"><span data-text="true"> by dragging prefabs into scene view during gameplay</span></span></div>
- 

```
using UnityEngine;

public class Movement : MonoBehaviour
{
    [SerializeField]
    private float speed = 10.0f;
    [SerializeField]
    private float xRange = 10.0f;
    [SerializeField]
    private float horizontalInput;
    [SerializeField] 
    public GameObject ProjectilePrefab;
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {


        horizontalInput = Input.GetAxis("Horizontal");
        // Calculate the desired position based on the input
        Vector3 desiredPosition = transform.position + Vector3.right * -horizontalInput * Time.deltaTime * speed;
        // Clamp the desired position within the x range
        float clampedX = Mathf.Clamp(desiredPosition.x, -xRange, xRange);
        desiredPosition = new Vector3(clampedX, desiredPosition.y, desiredPosition.z);
        // Move the object to the clamped position
        transform.position = desiredPosition;
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // shoot pizza
            Instantiate(ProjectilePrefab, transform.position, ProjectilePrefab.transform.rotation);
        }
    }
}

```

#### <span class="step-index_3pnc7n2S">5.</span>Make animals into prefabs

- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="bir1k-0-0"><span data-offset-key="bir1k-0-0" style="font-weight: bold;"><span data-text="true">Rotate</span></span><span data-offset-key="bir1k-0-1"><span data-text="true"> all animals on the Y axis by </span></span><span data-offset-key="bir1k-0-2" style="font-weight: bold;"><span data-text="true">180 degrees</span></span><span data-offset-key="bir1k-0-3"><span data-text="true"> to face down/ towards the player  
    </span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="bir1k-0-0"><span data-offset-key="3dc5-0-0" style="font-weight: bold;"><span data-text="true">Select</span></span><span data-offset-key="3dc5-0-1"><span data-text="true"> all three animals in the hierarchy and </span></span><span data-offset-key="3dc5-0-2" style="font-style: italic;"><span data-text="true">Add Component &gt; </span></span><span data-offset-key="3dc5-0-3" style="font-weight: bold; font-style: italic;"><span data-text="true">Move Forward</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="bir1k-0-0"><span data-offset-key="bhouu-0-0"><span data-text="true">Edit their </span></span><span data-offset-key="bhouu-0-1" style="font-weight: bold;"><span data-text="true">speed values</span></span><span data-offset-key="bhouu-0-2"><span data-text="true"> and </span></span><span data-offset-key="bhouu-0-3" style="font-weight: bold;"><span data-text="true">test</span></span><span data-offset-key="bhouu-0-4"><span data-text="true"> to see how it looks</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="bir1k-0-0"><span data-offset-key="9et7a-0-0"><span data-text="true">Drag all three animals into the </span></span><span data-offset-key="9et7a-0-1" style="font-weight: bold;"><span data-text="true">Prefabs folder</span></span><span data-offset-key="9et7a-0-2"><span data-text="true">, choosing “Original Prefab”</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="bir1k-0-0"><span data-offset-key="3dh7l-0-0" style="font-weight: bold;"><span data-text="true">Test</span></span><span data-offset-key="3dh7l-0-1"><span data-text="true"> by dragging prefabs into scene view during gameplay</span></span></div>

#### <span class="step-index_3pnc7n2S">6.</span>Destroy projectiles offscreen

- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="frrhg-0-0"><span data-offset-key="frrhg-0-0"><span data-text="true">Create “</span></span><span data-offset-key="frrhg-0-1" style="text-decoration: underline;"><span data-text="true">DestroyOutOfBounds</span></span><span data-offset-key="frrhg-0-2"><span data-text="true">” script and apply it to the </span></span><span data-offset-key="frrhg-0-3" style="font-weight: bold;"><span data-text="true">projectile</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="frrhg-0-0"><span data-offset-key="a7cvd-0-0"><span data-text="true">Add a new </span></span><span data-offset-key="a7cvd-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">private float topBound </span></span><span data-offset-key="a7cvd-0-2"><span data-text="true">variable and initialize it </span></span><span data-offset-key="a7cvd-0-3" style="font-weight: bold; font-style: italic;"><span data-text="true">= 30;</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="frrhg-0-0"><span data-offset-key="bce7o-0-0"><span data-text="true">Write code to destroy if out of top bounds </span></span><span data-offset-key="bce7o-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">if (transform.position.z &gt; topBound) {</span></span> <span data-offset-key="bce7o-0-3" style="font-weight: bold; font-style: italic;"><span data-text="true">Destroy(gameObject); }</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="frrhg-0-0"><span data-offset-key="2d5mf-0-0"><span data-text="true">In the Inspector </span></span><span data-offset-key="2d5mf-0-1" style="font-weight: bold;"><span data-text="true">Overrides</span></span><span data-offset-key="2d5mf-0-2"><span data-text="true"> drop-down, click </span></span><span data-offset-key="2d5mf-0-3" style="font-weight: bold;"><span data-text="true">Apply all</span></span><span data-offset-key="2d5mf-0-4"><span data-text="true"> to apply it to prefab</span></span></div>

#### <span class="step-index_3pnc7n2S">7. </span>Destroy animals offscreen

- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="9ee7-0-0"><span data-offset-key="9ee7-0-0"><span data-text="true">Create </span></span><span data-offset-key="9ee7-0-1" style="font-weight: bold;"><span data-text="true">else-if statement</span></span><span data-offset-key="9ee7-0-2"><span data-text="true"> to check if objects are beneath </span></span><span data-offset-key="9ee7-0-3" style="font-weight: bold; font-style: italic;"><span data-text="true">lowerBound</span></span><span data-offset-key="9ee7-0-4"><span data-text="true">: </span></span><span data-offset-key="9ee7-0-5" style="font-weight: bold; font-style: italic;"><span data-text="true">else if (transform.position.z &lt; lowerBound)</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="9ee7-0-0"><span data-offset-key="aq7da-0-0" style="font-weight: bold;"><span data-text="true">Apply</span></span><span data-offset-key="aq7da-0-1"><span data-text="true"> the script to all of the animals, then </span></span><span data-offset-key="aq7da-0-2" style="font-weight: bold;"><span data-text="true">Override</span></span><span data-offset-key="aq7da-0-3"><span data-text="true"> the prefabs</span></span></div>
- 

## <span class="step-index_3pnc7n2S">8.</span>Lesson Recap

<div id="bkmrk-new-functionality-th"><div><div class="" data-block="true" data-editor="editorBody_7" data-offset-key="a0kdh-0-0"><div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="a0kdh-0-0"><span data-offset-key="a0kdh-0-0"><span data-text="true">New Functionality</span></span></div><div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="a0kdh-0-0">- <span data-offset-key="6ki8o-0-0"><span data-text="true">The player can press the Spacebar to launch a projectile prefab,</span></span>

</div></div></div></div><span data-offset-key="dgru8-0-0"><span data-text="true">Projectile and Animals are removed from the scene if they leave the screen</span></span>

<div id="bkmrk-new-concepts-%26-skill"><div><div class="" data-block="true" data-editor="editorBody_7" data-offset-key="a0kdh-0-0"><div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="a0kdh-0-0"><div class="" data-block="true" data-editor="editorBody_7" data-offset-key="90m98-0-0"><div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="90m98-0-0"></div><div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="90m98-0-0"><span data-offset-key="90m98-0-0"><span data-text="true">New Concepts &amp; Skills</span></span></div></div>- <span data-offset-key="a1s6j-0-0"><span data-text="true">Create Prefabs</span></span>
- <span data-offset-key="9mdnl-0-0"><span data-text="true">Override Prefabs</span></span>
- <span data-offset-key="3msvk-0-0"><span data-text="true">Test for Key presses</span></span>
- <span data-offset-key="eeef8-0-0"><span data-text="true">Instantiate objects</span></span>
- <span data-offset-key="2lh2t-0-0"><span data-text="true">Destroy objects   
    </span></span><div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="6k73b-0-0"></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="6k73b-0-0"><span data-offset-key="6k73b-0-0"><span data-text="true">Else-if statements</span></span></div>

</div></div></div></div><span data-offset-key="cepfp-0-0"><span data-text="true">Next Lesson</span></span>

- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="6l4iv-0-0"><span data-offset-key="6l4iv-0-0"><span data-text="true">Instead of dropping all these animal prefabs onto the scene, we’ll create a herd of animals roaming the plain!</span></span></div>

<span data-offset-key="6l4iv-0-0"><span data-text="true">(</span></span>

<div class="summary-wrap_264BSiek" id="bkmrk-lesson-2.2---food-fl"><div class="title_Pamsf-Zm">Lesson 2.2 - Food Flight</div><div class="summary-skill_2FzwBQpY"><div class="summary-title_rYpNyakI">Skills practiced:</div><div class="skills_1cZhQPOv"><div class="skill-wrap_3FoiCVdI"><div class="skill-title_2DsU0stE">Absolute Beginner Code Comprehension</div><div class="sub-skills"><div class="sub-skill-wrap_2J3EHoby">Interpret simple code</div><div class="sub-skill-wrap_2J3EHoby">Improve simple code using the features of an IDE</div></div></div><div class="skill-wrap_3FoiCVdI"><div class="skill-title_2DsU0stE">Absolute Beginner Application Scripting</div><div class="sub-skills"><div class="sub-skill-wrap_2J3EHoby">Use common logic structures to control the execution of code.</div><div class="sub-skill-wrap_2J3EHoby">Write code that utilizes the various Unity APIs</div><div class="sub-skill-wrap_2J3EHoby">Implement appropriate data types</div><div class="sub-skill-wrap_2J3EHoby">Write code that integrates into an existing system</div><div class="sub-skill-wrap_2J3EHoby">Implement a code style that is efficient and easy to read</div><div class="sub-skill-wrap_2J3EHoby">Prototype new concepts</div></div></div></div></div></div><div id="bkmrk-%29"><div data-offset-key="1sk40-0-0">)  
</div><div data-offset-key="1sk40-0-0">  
</div><div class="" data-block="true" data-editor="editorBody_7" data-offset-key="1sk40-0-0"><div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="1sk40-0-0"></div></div></div>

# Random Animal Stampeed

#### <span class="step-index_3pnc7n2S">1.</span> Create a spawn manager

- <span data-offset-key="2je8v-0-0"><span data-text="true">In the Hierarchy, create an </span></span><span data-offset-key="2je8v-0-1" style="font-weight: bold;"><span data-text="true">Empty object</span></span><span data-offset-key="2je8v-0-2"><span data-text="true"> called “</span></span><span data-offset-key="2je8v-0-3" style="text-decoration: underline;"><span data-text="true">SpawnManager</span></span><span data-offset-key="2je8v-0-4"><span data-text="true">”</span></span>
- <span data-offset-key="78ksq-0-0"><span data-text="true">Create a new script called “</span></span><span data-offset-key="78ksq-0-1" style="text-decoration: underline;"><span data-text="true">SpawnManager</span></span><span data-offset-key="78ksq-0-2"><span data-text="true">”, attach it to the </span></span><span data-offset-key="78ksq-0-3" style="font-weight: bold;"><span data-text="true">Spawn Manager</span></span><span data-offset-key="78ksq-0-4"><span data-text="true">, and open it</span></span>
- <span data-offset-key="f1q8c-0-0"><span data-text="true">Declare new </span></span><span data-offset-key="f1q8c-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">public GameObject\[ \] animalPrefabs;</span></span>
- <span data-offset-key="fspas-0-0"><span data-text="true">In the Inspector, change the </span></span><span data-offset-key="fspas-0-1" style="font-weight: bold;"><span data-text="true">Array size</span></span><span data-offset-key="fspas-0-2"><span data-text="true"> to match your animal count, then </span></span><span data-offset-key="fspas-0-3" style="font-weight: bold;"><span data-text="true">assign</span></span><span data-offset-key="fspas-0-4"><span data-text="true"> your animals by </span></span><span data-offset-key="fspas-0-5" style="font-weight: bold;"><span data-text="true">dragging </span></span><span data-offset-key="fspas-0-6"><span data-text="true">them from the Project window into the empty slots </span></span><span data-offset-key="fspas-0-7" style="font-weight: bold;"><span data-text="true">Note: </span></span><span data-offset-key="fspas-0-8"><span data-text="true">Make sure you drag them from the </span></span><span data-offset-key="fspas-0-9" style="font-weight: bold;"><span data-text="true">Project </span></span><span data-offset-key="fspas-0-10"><span data-text="true">window; not the Hierarchy! If you're going to spawn objects, you need to make sure you're using Prefabs, which are stored in the Project window.</span></span>

#### <span class="step-index_3pnc7n2S">2.</span> Spawn an animal if S is pressed

- <span data-offset-key="d2kl5-0-0"><span data-text="true">In </span></span><span data-offset-key="d2kl5-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">Update()</span></span><span data-offset-key="d2kl5-0-2"><span data-text="true">, write an if-then statement to </span></span><span data-offset-key="d2kl5-0-3" style="font-weight: bold;"><span data-text="true">instantiate</span></span><span data-offset-key="d2kl5-0-4"><span data-text="true"> a new animal prefab at the top of the screen if </span></span><span data-offset-key="d2kl5-0-5" style="font-weight: bold;"><span data-text="true">S </span></span><span data-offset-key="d2kl5-0-6"><span data-text="true">is pressed</span></span>
- <span data-offset-key="c9aur-0-0"><span data-text="true">Declare a new </span></span><span data-offset-key="c9aur-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">public int animalIndex</span></span><span data-offset-key="c9aur-0-2"><span data-text="true"> and incorporate it in the </span></span><span data-offset-key="c9aur-0-3" style="font-weight: bold;"><span data-text="true">Instantiate </span></span><span data-offset-key="c9aur-0-4"><span data-text="true">call, then test editing the value in the Inspector</span></span>

#### <span class="step-index_3pnc7n2S">3.</span> Spawn random animals from an array

- <span data-offset-key="9javl-0-0"><span data-text="true">In the if-statement checking if S is pressed, generate a random </span></span><span data-offset-key="9javl-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">int animalIndex </span></span><span data-offset-key="9javl-0-2"><span data-text="true">between 0 and the length of the array</span></span>
- <span data-offset-key="90ftq-0-0"><span data-text="true">Remove the global </span></span><span data-offset-key="90ftq-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">animalIndex</span></span><span data-offset-key="90ftq-0-2"><span data-text="true"> variable, since it is only needed locally in the </span></span><span data-offset-key="90ftq-0-3" style="font-weight: bold;"><span data-text="true">if-statement</span></span>


#### <span class="step-index_3pnc7n2S">4.</span> Randomize the spawn location

- <span data-offset-key="er8h8-0-0" style="font-weight: bold;"><span data-text="true">Replace</span></span><span data-offset-key="er8h8-0-1"><span data-text="true"> the X value for the Vector3 with </span></span><span data-offset-key="er8h8-0-2" style="font-weight: bold; font-style: italic;"><span data-text="true">Random.Range(-20, 20)</span></span><span data-offset-key="er8h8-0-3"><span data-text="true">, then test</span></span>
- <span data-offset-key="d3ca9-0-0"><span data-text="true">Within the </span></span><span data-offset-key="d3ca9-0-1" style="font-weight: bold;"><span data-text="true">if-statement</span></span><span data-offset-key="d3ca9-0-2"><span data-text="true">, make a new local </span></span><span data-offset-key="d3ca9-0-3" style="font-weight: bold; font-style: italic;"><span data-text="true">Vector3 spawnPos</span></span><span data-offset-key="d3ca9-0-4"><span data-text="true"> variable </span></span>
- <span data-offset-key="c8ueq-0-0"><span data-text="true">At the top of the class, create </span></span><span data-offset-key="c8ueq-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">private float</span></span><span data-offset-key="c8ueq-0-2"><span data-text="true"> variables for </span></span><span data-offset-key="c8ueq-0-3" style="font-weight: bold; font-style: italic;"><span data-text="true">spawnRangeX</span></span><span data-offset-key="c8ueq-0-4"><span data-text="true"> and </span></span><span data-offset-key="c8ueq-0-5" style="font-weight: bold; font-style: italic;"><span data-text="true">spawnPosZ</span></span>

<span class="step-index_3pnc7n2S">5.</span> Change the perspective of the camera

- <span data-offset-key="98crv-0-0"><span data-text="true">Toggle between </span></span><span data-offset-key="98crv-0-1" style="font-weight: bold;"><span data-text="true">Perspective</span></span><span data-offset-key="98crv-0-2"><span data-text="true"> and </span></span><span data-offset-key="98crv-0-3" style="font-weight: bold;"><span data-text="true">Isometric</span></span><span data-offset-key="98crv-0-4"><span data-text="true"> view in the Scene view to appreciate the difference</span></span>
- <span data-offset-key="1nd15-0-0"><span data-text="true">Select the </span></span><span data-offset-key="1nd15-0-1" style="font-weight: bold;"><span data-text="true">camera</span></span><span data-offset-key="1nd15-0-2"><span data-text="true"> and change the </span></span><span data-offset-key="1nd15-0-3" style="font-weight: bold;"><span data-text="true">Projection</span></span><span data-offset-key="1nd15-0-4"><span data-text="true"> from “Perspective” to “Orthographic”</span></span>

<span class="step-index_3pnc7n2S">6.</span> Lesson Recap

<div class="" data-block="true" data-editor="editorBody_5" data-offset-key="2snu3-0-0" id="bkmrk-new-functionality"><div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="2snu3-0-0"><span data-offset-key="2snu3-0-0"><span data-text="true">New Functionality</span></span></div></div>- <span data-offset-key="94l2b-0-0"><span data-text="true">The player can press the S to spawn an animal</span></span>
- <span data-offset-key="20q6d-0-0"><span data-text="true">Animal selection and spawn location are randomized</span></span>
- <span data-offset-key="8gkui-0-0"><span data-text="true">Camera projection (perspective/orthographic) selected</span></span><span data-offset-key="2ce1r-0-0"><span data-text="true">  
    </span></span>


<span data-offset-key="2ce1r-0-0"><span data-text="true">New Concepts &amp; Skills</span></span>

- - <span data-offset-key="5kv4h-0-0"><span data-text="true">Spawn Manager</span></span>
    - <span data-offset-key="f90v9-0-0"><span data-text="true">Arrays</span></span>
    - <span data-offset-key="bcthe-0-0"><span data-text="true">Keycodes</span></span>
    - <span data-offset-key="4jrs2-0-0"><span data-text="true">Random generation</span></span>
    - <span data-offset-key="e2mto-0-0"><span data-text="true">Local vs Global variables</span></span>
    - <span data-offset-key="e2mto-0-0"><span data-text="true">Perspective</span></span><span data-offset-key="eeh84-0-0"><span data-text="true"> vs Isometric projections</span></span>

<span data-offset-key="9313r-0-0"><span data-text="true">Next Lesson</span></span>

- <span data-offset-key="ki0o-0-0"><span data-text="true">Using collisions to feed our animals!</span></span>

# Collision Decisions + GAME OVER

## <span class="step-index_3pnc7n2S">1. </span>Make a new method to spawn animals

- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="f1fob-0-0"><span data-offset-key="f1fob-0-0"><span data-text="true">In </span></span><span data-offset-key="f1fob-0-1" style="font-weight: bold;"><span data-text="true">SpawnManager.cs</span></span><span data-offset-key="f1fob-0-2"><span data-text="true">, create a new </span></span><span data-offset-key="f1fob-0-3" style="font-weight: bold; font-style: italic;"><span data-text="true">void SpawnRandomAnimal() {}</span></span><span data-offset-key="f1fob-0-4"><span data-text="true"> function beneath </span></span><span data-offset-key="f1fob-0-5" style="font-weight: bold; font-style: italic;"><span data-text="true">Update()</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="f1fob-0-0"><span data-offset-key="d2knm-0-0"><span data-text="true">Cut and paste the code from the </span></span><span data-offset-key="d2knm-0-1" style="font-weight: bold;"><span data-text="true">if-then statement</span></span><span data-offset-key="d2knm-0-2"><span data-text="true"> to the </span></span><span data-offset-key="d2knm-0-3" style="font-weight: bold;"><span data-text="true">new function</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="f1fob-0-0"><span data-offset-key="6ibv-0-0"><span data-text="true">Call </span></span><span data-offset-key="6ibv-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">SpawnRandomAnimal();</span></span><span data-offset-key="6ibv-0-2"><span data-text="true"> if </span></span><span data-offset-key="6ibv-0-3" style="font-weight: bold;"><span data-text="true">S</span></span><span data-offset-key="6ibv-0-4"><span data-text="true"> is pressed</span></span></div>

## <span class="step-index_3pnc7n2S">2.</span> Spawn the animals at timed intervals

- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="5a6h3-0-0"><span data-offset-key="5a6h3-0-0"><span data-text="true">In </span></span><span data-offset-key="5a6h3-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">Start()</span></span><span data-offset-key="5a6h3-0-2"><span data-text="true">, use </span></span><span data-offset-key="5a6h3-0-3" style="font-weight: bold; font-style: italic;"><span data-text="true">InvokeRepeating</span></span><span data-offset-key="5a6h3-0-4"><span data-text="true"> to spawn the animals based on an interval, then </span></span><span data-offset-key="5a6h3-0-5" style="font-weight: bold;"><span data-text="true">test</span></span><span data-offset-key="5a6h3-0-6"><span data-text="true">.</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="5a6h3-0-0"><span data-offset-key="36buv-0-0"><span data-text="true">Remove the</span></span><span data-offset-key="36buv-0-1" style="font-weight: bold;"><span data-text="true"> if-then statement</span></span><span data-offset-key="36buv-0-2"><span data-text="true"> that tests for </span></span><span data-offset-key="36buv-0-3" style="font-weight: bold;"><span data-text="true">S</span></span><span data-offset-key="36buv-0-4"><span data-text="true"> being pressed</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="5a6h3-0-0"><span data-offset-key="b7cpc-0-0"><span data-text="true">Declare new </span></span><span data-offset-key="b7cpc-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">private startDelay</span></span><span data-offset-key="b7cpc-0-2"><span data-text="true"> and </span></span><span data-offset-key="b7cpc-0-3" style="font-weight: bold; font-style: italic;"><span data-text="true">spawnInterval</span></span><span data-offset-key="b7cpc-0-4"><span data-text="true"> variables then playtest and tweak variable values</span></span></div>

## <span class="step-index_3pnc7n2S">3.</span> Add collider and trigger components

- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="chn26-0-0"><span data-offset-key="chn26-0-0"><span data-text="true">Double-click on one of the </span></span><span data-offset-key="chn26-0-1" style="font-weight: bold;"><span data-text="true">animal prefabs</span></span><span data-offset-key="chn26-0-2"><span data-text="true">, then </span></span><span data-offset-key="chn26-0-3" style="font-style: italic;"><span data-text="true">Add Component &gt; Box Collider</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="chn26-0-0"><span data-offset-key="aguuj-0-0"><span data-text="true">Click </span></span><span data-offset-key="aguuj-0-1" style="font-weight: bold;"><span data-text="true">Edit Collider</span></span><span data-offset-key="aguuj-0-2"><span data-text="true">, then </span></span><span data-offset-key="aguuj-0-3" style="font-weight: bold;"><span data-text="true">drag</span></span><span data-offset-key="aguuj-0-4"><span data-text="true"> the collider handles to encompass the object</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="chn26-0-0"><span data-offset-key="380nm-0-0"><span data-text="true">Check the “</span></span><span data-offset-key="380nm-0-1" style="font-weight: bold;"><span data-text="true">Is Trigger</span></span><span data-offset-key="380nm-0-2"><span data-text="true">” checkbox</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="chn26-0-0"><span data-offset-key="654rd-0-0"><span data-text="true">Repeat this process for each of the </span></span><span data-offset-key="654rd-0-1" style="font-weight: bold;"><span data-text="true">animals</span></span><span data-offset-key="654rd-0-2"><span data-text="true"> and the </span></span><span data-offset-key="654rd-0-3" style="font-weight: bold;"><span data-text="true">projectile</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="chn26-0-0"><span data-offset-key="cs5k5-0-0"><span data-text="true">Add a </span></span><span data-offset-key="cs5k5-0-1" style="font-weight: bold;"><span data-text="true">RigidBody component</span></span><span data-offset-key="cs5k5-0-2"><span data-text="true"> to the projectile and uncheck “use gravity” </span></span></div>

## <span class="step-index_3pnc7n2S">4.</span> Destroy objects on collision

- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="bk1l-0-0"><span data-offset-key="bk1l-0-0"><span data-text="true">Create a new </span></span><span data-offset-key="bk1l-0-1" style="font-weight: bold;"><span data-text="true">DetectCollisions.cs</span></span><span data-offset-key="bk1l-0-2"><span data-text="true"> script, add it to each animal prefab, then </span></span><span data-offset-key="bk1l-0-3" style="font-weight: bold;"><span data-text="true">open</span></span><span data-offset-key="bk1l-0-4"><span data-text="true"> it</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="bk1l-0-0"><span data-offset-key="eo1qh-0-0"><span data-text="true">Before the final </span></span><span data-offset-key="eo1qh-0-1" style="font-weight: bold;"><span data-text="true">}</span></span><span data-offset-key="eo1qh-0-2"><span data-text="true"> add an </span></span><span data-offset-key="eo1qh-0-3" style="font-weight: bold; font-style: italic;"><span data-text="true">OnTriggerEnter</span></span><span data-offset-key="eo1qh-0-4"><span data-text="true"> function using </span></span><span data-offset-key="eo1qh-0-5" style="font-weight: bold;"><span data-text="true">autocomplete</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="bk1l-0-0"><span data-offset-key="6frbo-0-0"><span data-text="true">In </span></span><span data-offset-key="6frbo-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">OnTriggerEnter</span></span><span data-offset-key="6frbo-0-2"><span data-text="true">, put </span></span><span data-offset-key="6frbo-0-3" style="font-weight: bold; font-style: italic;"><span data-text="true">Destroy(gameObject)</span></span><span data-offset-key="6frbo-0-4" style="font-weight: bold;"><span data-text="true">;</span></span><span data-offset-key="6frbo-0-5"><span data-text="true">, then test</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="bk1l-0-0"><span data-offset-key="aa2e6-0-0"><span data-text="true">In </span></span><span data-offset-key="aa2e6-0-1" style="font-weight: bold; font-style: italic;"><span data-text="true">OnTriggerEnter</span></span><span data-offset-key="aa2e6-0-2"><span data-text="true">, put </span></span><span data-offset-key="aa2e6-0-3" style="font-weight: bold; font-style: italic;"><span data-text="true">Destroy(other.gameObject);</span></span></div>

## <span class="step-index_3pnc7n2S">5.</span> Trigger a “Game Over” message

- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="dnd83-0-0"><span data-offset-key="dnd83-0-0"><span data-text="true">In DestroyOutOfBounds.cs, in the </span></span><span data-offset-key="dnd83-0-1" style="font-weight: bold;"><span data-text="true">else-if condition</span></span><span data-offset-key="dnd83-0-2"><span data-text="true"> that checks if the animals reach the bottom of the screen, add a Game Over messsage: </span></span><span data-offset-key="dnd83-0-3" style="font-weight: bold; font-style: italic;"><span data-text="true">Debug.Log(“Game Over!”)</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="dnd83-0-0"><span data-offset-key="bvnd-0-0"><span data-text="true">Clean up your code with </span></span><span data-offset-key="bvnd-0-1" style="font-weight: bold;"><span data-text="true">comments</span></span></div>
- <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="dnd83-0-0"><span data-offset-key="955jv-0-0"><span data-text="true">If using Visual Studio, Click </span></span><span data-offset-key="955jv-0-1" style="font-style: italic;"><span data-text="true">Edit &gt; Advanced &gt;</span></span><span data-offset-key="955jv-0-2" style="font-style: italic; font-weight: bold;"><span data-text="true"> Format document</span></span><span data-offset-key="955jv-0-3"><span data-text="true"> to fix any indentation issues (On a </span></span><span data-offset-key="955jv-0-4" style="font-weight: bold;"><span data-text="true">Mac</span></span><span data-offset-key="955jv-0-5"><span data-text="true">, click </span></span><span data-offset-key="955jv-0-6" style="font-style: italic;"><span data-text="true">Edit &gt; Format &gt; Format Document)</span></span></div>

## <span class="step-index_3pnc7n2S">6.</span> Lesson Recap

<div id="bkmrk-new-functionality-an"><div class="" data-block="true" data-editor="editorBody_5" data-offset-key="3655v-0-0"><div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="3655v-0-0"><span data-offset-key="3655v-0-0"><span data-text="true">New Functionality</span></span></div><div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="3655v-0-0">- <span data-offset-key="d7r72-0-0"><span data-text="true">Animals spawn on a timed interval and walk down the screen</span></span>
- <span data-offset-key="d7r72-0-0"><span data-text="true">When animals get past the player, it triggers a “Game Over” message</span></span>
- <span data-offset-key="3qsmo-0-0"><span data-text="true">If a projectile collides with an animal, both objects are removed</span></span>

</div></div></div><div id="bkmrk-new-concepts-%26-skill"><div class="" data-block="true" data-editor="editorBody_5" data-offset-key="d794m-0-0"><div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="d794m-0-0"><span data-offset-key="d794m-0-0"><span data-text="true">New Concepts &amp; Skills</span></span></div><div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="d794m-0-0">- <span data-offset-key="5v7c3-0-0"><span data-text="true">Create custom methods/functions</span></span>
- <span data-offset-key="bggs6-0-0"><span data-text="true">InvokeRepeating() to repeat code</span></span>
- <span data-offset-key="5q4or-0-0"><span data-text="true">Colliders and Triggers   
    </span></span>
- <span data-offset-key="akrks-0-0"><span data-text="true">Override functions</span></span>
- <span data-offset-key="b0lne-0-0"><span data-offset-key="b0lne-0-0"><span data-text="true">Log Debug messages to console  
      
    Pizza\_gun  
    </span></span></span>```c#
    using UnityEngine;
    
    public class Pizza_gun : MonoBehaviour
    {
        [SerializeField]
        public float Weapon_Bullet_Projectile_Speed = 60.0f;
        [SerializeField] 
        private float topBound = -60;
    
        // Update is called once per frame
        void Update()
        {
            transform.Translate(Vector3.forward * Time.deltaTime * Weapon_Bullet_Projectile_Speed);
    
           if (transform.position.z < topBound)
            {
                Destroy(gameObject);
            }
    
        }
        private void OnTriggerEnter(Collider other)
        {
            Destroy(gameObject);
            Destroy(other.gameObject);
        }
    }
    
    ```
    
    <span data-offset-key="b0lne-0-0"><span data-text="true">Spawn\_manager  
    </span></span>
- ```
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class SpawnManager : MonoBehaviour
    {
        public GameObject[] animalPrefabs = new GameObject[10];
        [SerializeField] 
        private float spawnRangeX = 20.0f;
        [SerializeField] 
        private float spawnPozY = -20.0f;
        [SerializeField]
        private float startDelay = 5f;
        [SerializeField]
       private float spawnInterval = 2f;
        // Start is called before the first frame update
        void Start()
        {
            // invoke repeating, will make the method or void def function with name "nameInQuotes"
            // it will call that function after , delay, then chozen interval
            InvokeRepeating("SpawnRandomAnimal", startDelay, spawnInterval);
        }
    
        // Update is called once per frame
        void Update()
        {
            if (Input.GetKeyDown(KeyCode.S))
            {
               SpawnRandomAnimal();
            }
        }
        void SpawnRandomAnimal()
        {
            // Select a random index within the array range
            int random_animal_Index = Random.Range(0, animalPrefabs.Length);
            Vector3 spawnPos = new Vector3(Random.Range(-spawnRangeX, spawnRangeX), spawnPozY, -30);
            // Instantiate the selected animalPrefab
            Instantiate(animalPrefabs[random_animal_Index], spawnPos,
                animalPrefabs[random_animal_Index].transform.rotation);
        }
    }
    
    ```
- movement
    
    ```
    using UnityEngine;
    
    public class Movement : MonoBehaviour
    {
        [SerializeField]
        private float speed = 10.0f;
        [SerializeField]
        private float xRange = 10.0f;
        [SerializeField]
        private float horizontalInput;
        [SerializeField] 
        public GameObject ProjectilePrefab;
        // Start is called before the first frame update
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
    
    
            horizontalInput = Input.GetAxis("Horizontal");
            // Calculate the desired position based on the input
            Vector3 desiredPosition = transform.position + Vector3.right * -horizontalInput * Time.deltaTime * speed;
            // Clamp the desired position within the x range
            float clampedX = Mathf.Clamp(desiredPosition.x, -xRange, xRange);
            desiredPosition = new Vector3(clampedX, desiredPosition.y, desiredPosition.z);
            // Move the object to the clamped position
            transform.position = desiredPosition;
            if (Input.GetKeyDown(KeyCode.Space))
            {
                // shoot pizza
                Instantiate(ProjectilePrefab, transform.position, ProjectilePrefab.transform.rotation);
            }
        }
    }
    
    ```
    
    Animal Movement
    
    ```
    using UnityEngine;
    
    public class AnimalMovement : MonoBehaviour
    {
    
    
        public float Animal_Movement_Speed = 50.0f;
        public float lowerBound = 50;
        // Start is called before the first frame update
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
            transform.Translate(Vector3.forward * Time.deltaTime * Animal_Movement_Speed);
            if (transform.position.z > lowerBound)
            {
                Destroy(gameObject);
                Debug.Log("In the vernacular of your people... \n Game Over!");
            }
        }
    }
    
    ```
- 

</div></div></div>