# PickUp PreFabs

Throughout our game we will want to have game items for the player to collide with to earn **score points or to lose health value**. These will be called **PickUp items**.  We'll create a simple script component: **PickUp.cs** that allows setting a point value for each item instance.   We'll turn these gameObjects into **Prefabs**, which are stored as a reusable project asset.

## Create / Configure PickUp GameObject

In Unity, we'll want to create and configure gameObjects that will have the PickUp.cs script component attached to give desired behavior. The PickUp objects in your game must have **tag: Collectible**, at least one should have **tag: Hazard.**

* Create a 2D Sprite GameObject
* Set the [**Sorting Layer**](/cs2335/project-1-simple-game/pickup_items/background-image-add-sorting-layers.md) to **Spawned (See** [**SortingLayers**](/cs2335/project-1-simple-game/pickup_items/background-image-add-sorting-layers.md)**)**&#x20;
* **Physics2D Collision:**  Add a **Collider2D** to the GameObject, configure collider shape
* Configure the **Collider2D to be isTrigger == true**
* **Tags:** Create custom Tags, set a tag for each PickUp gameObjects:  "**Collectible**", "**Hazard**", other? See images below
* **Physics2D Movement** Optional: Add Rigidbody2D if the gameObject will move
  * Add additional **Collider2D inside the trigger Collider2D,** to keep this **moving** gameObject from falling through the floor's Collider2D.
* **Script Logic:**  Add **PickUp.cs** script (see below)
  * **Select type** from dropdown in inspector
  * **Set value**, set with a **positive value** ( Collectibles, Hazards )
* **Prefab:** Drag into Project Assets Resource Folder to create as a prefab

![Add Custom Tags to each PickUp:  Collectible, Hazard](/files/-MFl1Wd8e3-ItO71x28U)

![Set the Tag on the PickUp gameObject  by selecting Collectible Tag in the Inspector](/files/-MH2yw0bcXTbnUJ4-xqQ)

## Prefab: &#x20;

Prefabs provide a method for turning any **gameObject into an asset,** whereas normally a gameObject is defined strictly within the scene where it was first created.  Prefabs allow instantiation (spawning) of gameObjects during gamePlay.  Prefabs can be exported from your project and reused in another Unity project.  For any gameObject that is non-trivial, creating a prefab ensures that you'll aways have a saved version of the object, in case a particular scene gets corrupted. &#x20;

> Unity’s **Prefab** system allows you to **create, configure, and store** a **GameObject**\
> &#x20;complete with all its components, property values, and child GameObjects as a reusable **Asset**. The **Prefab** Asset acts as a template from which you can create new **Prefab** instances in the **Scene**\
> \
> Any **edits** that you make to a **Prefab Asset** are automatically reflected in the instances of that Prefab, allowing you to easily make broad changes across your whole Project without having to repeatedly make the same edit to every copy of the Asset.\
> \
> [Unity Manual](https://docs.unity3d.com/Manual/Prefabs.html)[ ](https://docs.unity3d.com/Manual/Prefabs.html)

**Unique Prefab Instances vs Asset-Version of Prefab:**\
As described above:  if you make edits to the **asset-version of a prefab**, then those changes are immediately reflected in all instances across your project.  \
If you make **changes to a prefab instance within a scene, those changes will not impact any other prefabs,** unless you select to apply those changes to the level of the asset-version.   It is best to get your gameObject configured to it's final state before making the original prefab, otherwise, you may make changes (like adding a script component) to a gameObject in a scene, and forget that those changes do not impact the asset-version of the prefab.

## PickUp Class - v1

This is the first version of the PickUp Class Script, this will be modified in Project 3.

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public enum PickupType
{
    crate, crystal, rock, star                 //add as needed
}


public class PickUp : MonoBehaviour
{

  [SerializeField]  //allows modification in inspector 
  private int value;

    //read-only property
    public int Value
    {
        get { return value; }
    }


    public PickupType type; //what is the PickupType of this object

}// end class
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kdoore.gitbook.io/cs2335/project-1-simple-game/pickup_items.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
