---
title: "Lesson 4.1 - Watch Where You’re Going"
content_type: tutorial
url: "https://learn.unity.com/tutorial/lesson-4-1-watch-where-you-re-going-2?language=en"
language: en
difficulty: beginner
duration_minutes: 60
unity_version:
  - "6.0"
  - "6.3"
supported_unity_versions:
  - name: "6.0"
    url: "https://learn.unity.com/tutorial/lesson-4-1-watch-where-you-re-going-2.md?language=en&version=6.0"
  - name: "6.3"
    url: "https://learn.unity.com/tutorial/lesson-4-1-watch-where-you-re-going-2.md?language=en&version=6.3"
  - name: "2022.3"
    url: "https://learn.unity.com/tutorial/lesson-4-1-watch-where-you-re-going-2.md?language=en&version=2022.3"
  - name: "2021.3"
    url: "https://learn.unity.com/tutorial/lesson-4-1-watch-where-you-re-going-2.md?language=en&version=2021.3"
available_languages:
  - name: "en"
    url: "https://learn.unity.com/tutorial/lesson-4-1-watch-where-you-re-going-2.md?language=en"
  - name: "es"
    url: "https://learn.unity.com/tutorial/leccion-4-1-mira-por-donde-vas.md?language=es"
  - name: "ja"
    url: "https://learn.unity.com/tutorial/lesson-4-1-watch-where-you-re-going-jp.md?language=ja"
  - name: "ko"
    url: "https://learn.unity.com/tutorial/4-1gang-sijeom-seoljeong.md?language=ko"
last_updated: "2026-08-04T15:45:30.000Z"
---

# Lesson 4.1 - Watch Where You’re Going

Build a prototype where the camera orbits an island and a textured sphere moves forward or backward with player input.

**Overview:**

First things first, we will create a new prototype and download the starter files! You’ll notice a beautiful island, sky, and particle effect... all of which can be customized! Next you will allow the player to rotate the camera around the island in a perfect radius, providing a glorious view of the scene. The player will be represented by a sphere, wrapped in a detailed texture of your choice. Finally you will add force to the player, allowing them to move forwards or backwards in the direction of the camera.

**Project Outcome:**

The camera will evenly rotate around a focal point in the center of the island, provided a horizontal input from the player. The player will control a textured sphere, and move them forwards or backwards in the direction of the aforementioned focal point.

Overview: [Video](https://connect-mediagw.unity.com/h1/20241216/videos/91335f18-d995-410b-83e0-b468df933903_CWC_U4.L1.S0_Intro_U6.mp4) ([Transcript (en)](https://connect-mediagw.unity.com/h1/20241216/7f3b7e49-bce0-4637-ba5e-d1f1305c4fa3_CWC_U4.L1.S0_Intro.vtt))

## Materials

- [Prototype-4_Starter-Files](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.materials%5B_key==%22378ca2a3d40a%22%5D.file/Prototype-4_Starter-Files_20260613_023556.unitypackage)

## 1. Create project and open scene

You’ve done it before, and it’s time to do it again... we must start a new project and import the starter files.

[Video](https://connect-mediagw.unity.com/h1/20241202/videos/60021ed4-a33d-47b1-b9d5-52ba7486b53e_CWC_U4.L1.S1_U6.mp4) ([Transcript (en)](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%226mPVEs2A9KDZvKF7TiSUax%22%5D.body%5B_key==%226mPVEs2A9KDZvKF7TiSUf7%22%5D.subtitles/CWC_U4.L1.S1_U6_20260505_045113.srt))

1. Open **Unity Hub** and create a new **Universal 3D** project using the Unity version specified in this tutorial. Name the project Prototype 4.
   If you forget how to do this, refer to the instructions in [Lesson 1.1 - Step 1](https://learn.unity.com/course/create-with-code/unit/unit-1-driving-simulation/tutorial/lesson-1-1-start-your-3d-engines?version=6.0#674f41a1edbc2a1e806fc55b).
2. Click to download the [Prototype 4 Starter Files](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.materials%5B_key==%22378ca2a3d40a%22%5D.file/Prototype-4_Starter-Files_20260613_023556.unitypackage), **extract** the compressed folder, and then **import** the .unitypackage into your project.
   For instructions on importing packages, refer to the [Import local asset packages](https://docs.unity3d.com/Manual/AssetPackagesImport.html) documentation.
3. Open the **Prototype 4 scene** and delete the **Sample Scene** without saving.
4. Click **Run** to see the **particle effects.**

## 2. Set up the player and add a texture

We’ve got an island for the game to take place on, and now we need a sphere for the player to control and roll around.

[Video](https://connect-mediagw.unity.com/h1/20241202/videos/620143ba-9b29-4c1b-8963-ae69b01f5ef7_CWC_U4.L1.S2_U6.mp4) ([Transcript (en)](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%226mPVEs2A9KDZvKF7TiSVV8%22%5D.body%5B_key==%226mPVEs2A9KDZvKF7TiSVZI%22%5D.subtitles/CWC_U4.L1.S2_U6.mp4_20260505_045134.srt))

1. In the **Hierarchy**, right click (or select “+”) >  _3D Object > **Sphere**_
2. Rename it “Player”, reset its **position** and increase its XYZ **scale** to 1.5
3. Add a **RigidBody** component to the **Player**
4. From the _Course_Library > Textures_, drag a **texture** onto the **sphere**

## 3. Create a focal point for the camera

If we want the camera to rotate around the game in a smooth and cinematic fashion, we need to pin it to the center of the island with a focal point.

[Video](https://connect-mediagw.unity.com/h1/20241202/videos/cb5029b1-1614-4c63-a9e8-42fb3aea973b_CWC_U4.L1.S3_U6.mp4) ([Transcript (en)](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%226mPVEs2A9KDZvKF7TiSWRO%22%5D.body%5B_key==%226mPVEs2A9KDZvKF7TiSWVY%22%5D.subtitles/CWC_U4.L1.S3_U6_20260505_045149.srt))

1. Create a new **Empty Object** and rename it “Focal Point”,
2. Reset its position to the origin (0, 0, 0), and make the Camera a **child object** of it

![](https://connect-mediagw.unity.com/h1/20231229/learn/images/80b34602-aa10-4fe4-b751-c39e1ba14e05_image.png)

1. Create a new “Scripts” folder, and a new “RotateCamera” script inside it
2. **Attach** the “RotateCamera” script to the **Focal Point**

## 4. Configure project settings for the Input System

The code you’ll add in the following steps uses the **Input System** to handle player controls. To ensure the code works correctly, verify that your project is configured to allow both input systems to run side by side.

Follow the video and instructions below.

[Video](https://connect-mediagw.unity.com/h1/20250903/videos/89a8fcf6-41e6-4a5c-aae5-49a3825881cf_ChangeInputSystem.mp4)

**Instructions**

**1.** Open the **Player Settings**:

- From the main menu, select **Edit** > **Project Settings,** then select the **Player** category from the leftmost menu.

**2.** Enable support for both input systems:

- Find the **Configuration** section.
- From the **Active Input Handling** dropdown, select **Both**.
- Select the **Apply** button to confirm the change.

The Unity Editor will automatically restart to apply this setting. After restarting, your project will be correctly configured to handle input from both the original Input Manager and the newer Input System.

## 5. Explore the default Input Action Map

Now let’s talk about a built-in alternative to declaring new InputActions in scripts: the default Input Actions asset that ships with many 3D templates.

[Video](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%226mPVEs2A9KDZvKF7TiSX95%22%5D.body%5B_key==%226mPVEs2A9KDZvKF7TiSXDF%22%5D.overviewVideo/Unit%204.1%20-%20Step%205%20-%20Explore%20the%20default%20input%20Action%20Map%20-%20FINAL%20NEW_20260625_210356.mp4) ([Transcript (en)](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%226mPVEs2A9KDZvKF7TiSX95%22%5D.body%5B_key==%226mPVEs2A9KDZvKF7TiSXDF%22%5D.subtitles/Unit%204.1%20-%20Step%205%20-%20Explore%20the%20default%20input%20Action%20Map%20-%20FINAL%20NEW_20260625_210538.vtt))

1. We’ve been declaring actions in code and binding them in the **Inspector** window:
   - Example: **public InputAction jumpAction;** then **jumpAction.Enable();** and binding **Space** in the **Inspector** window.
   - This works well for quick setups or isolated actions per component.
2. Many default 3D projects include a complete Input Action asset (an InputActionMap) ready to use:
   - In the **Project** window, look for an asset named **InputSystem_Actions** or similar (often a **.inputactions** file).
   - Double-click it to open the Input Actions editor.
   - You’ll see Action Maps (like **Player**, **UI**, etc.), Actions (**Move**, **Jump**, **Fire**, **Look**), and Bindings for multiple devices (keyboard, mouse, gamepad, etc.).
3. Explore what’s inside:
   - Actions: Named inputs like **Move**, **Jump**, **Look**, **Fire**.
   - Bindings: Each action can have multiple bindings (WASD + Left Stick, Space + Gamepad South, Mouse Delta + Right Stick).
   - Processors/Interactions: Fine-tune behavior (for example, Press, Hold, Tap, Deadzones).
4. Benefits of using an Input Action asset:
   - **Centralized management:** All actions and bindings live in one place—easy to update without touching code.
   - **Multi-platform ready:** Add bindings for gamepads, keyboards, touch, etc., under the same action.
   - **Consistent code:** Your scripts read the same actions regardless of device:
     - Move uses a Vector2, Jump is a Button, Look is a Vector2.
   - **Easy rebinding:** You can support runtime rebinding without changing scripts.
   - Collaboration-friendly: Designers can tweak inputs in the asset, while code remains stable.

## 6. Generate a C# class for the Input_Actions

Create a strongly typed C# wrapper from your .inputactions asset so scripts can access input actions safely, without needing to set them up in the Inspector.

[Video](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%223a75cd094584%22%5D.body%5B_key==%22813667010d1a%22%5D.overviewVideo/4.2.6_20260804_154056.1%20-%20Generate%20a%20C) ([Transcript (en)](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%223a75cd094584%22%5D.body%5B_key==%22813667010d1a%22%5D.subtitles/4.2.6_20260804_154518.1%20-%20Generate%20a%20C))

1. Why generate a C# class?
   - **Strongly typed access:** You get properties for maps and actions (for example, **Player.Move**) instead of string lookups — fewer typos and easier refactors.
   - **Runtime representation:** The .inputactions asset is data; scripts need a runtime object to interact with. The generated class constructs and manages that for you.
   - **Cleaner code vs. direct asset references:** MonoBehaviours can’t directly “read” actions from the asset without either:
     1. Adding InputActionReference fields and assigning each action in the Inspector, or
     2. Instantiating the generated class and using its maps/actions in code.
   - Easy enabling/disabling: Enable entire maps or specific actions with simple calls.
2. How to generate the class:
   - Open your **.inputactions** asset in the **Inspector** window.
   - In the upper-right, enable **Generate C# Class**.
   - Set the Class Name (for example, **InputSystem_Actions**) and choose a path/namespace.
   - Select **Apply/Save** to generate the script.


## 7. Get a reference to the Player Action Map

The camera is rotating perfectly around the island, but now we’ll wire up the new Input System so we can read movement from the Player action map.

[Video](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%22f8e5df337b16%22%5D.body%5B_key==%221f4aebe2d322%22%5D.overviewVideo/Unit%204.1%20-%20Step%207%20-%20Get%20a%20reference%20to%20the%20Player%20Action%20Map%20-%20FINAL%20NEW_20260625_210930.mp4) ([Transcript (en)](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%22f8e5df337b16%22%5D.body%5B_key==%221f4aebe2d322%22%5D.subtitles/Unit%204.1%20-%20Step%207%20-%20Get%20a%20reference%20to%20the%20Player%20Action%20Map%20-%20FINAL%20NEW_20260625_211042.vtt))

1. Open your **RotateCamera** script.
2. Add a private controls field using your generated class.
3. Initialize the controls in the **Awake()** function.
4. Enable the Player action map in the **OnEnable()** function and print the Move action for verification
5. **controls = new InputSystem_Actions();** instantiates your generated input class, which builds a runtime copy of your **.inputactions** asset. Think of it like new Vector3(…), but for an input wrapper that gives you typed access to actions such as **Player.Move** and **Player.Jump**.
6. Lifecycle: **Awake** runs once when the script instance is created—good for constructing GameObjects and initializing references. OnEnable runs each time the component or GameObject is enabled—ideal for enabling input maps and subscribing to events. Pair OnEnable with OnDisable to cleanly enable/disable inputs with the object’s active state.

![](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%22f8e5df337b16%22%5D.body%5B_key==%221ccbbaf49eb2%22%5D.image/Untitled%209_20260603_154812.png)

## 8. Rotate the focal point by user input

Now that the camera is attached to the focal point, the player must be able to rotate it - and the camera child object - around the island with horizontal input.

[Video](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%22e258615bb27e%22%5D.body%5B_key==%22207d2c40595c%22%5D.overviewVideo/Unit%204.1%20-%20Step%208%20-%20Rotate%20the%20focal%20point%20by%20user%20input%20-%20FINAL%20NEW_20260625_211115.mp4) ([Transcript (en)](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%22e258615bb27e%22%5D.body%5B_key==%22207d2c40595c%22%5D.subtitles/Unit%204.1%20-%20Step%208%20-%20Rotate%20the%20focal%20point%20by%20user%20input%20-%20FINAL%20NEW_20260625_211827.vtt))

1. Create the code to rotate the camera based on **rotationSpeed** and **horizontalInput**
2. Tweak the **rotation speed** value to get the speed you want

![](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%22e258615bb27e%22%5D.body%5B_key==%22b897531dba1e%22%5D.image/Untitled%207_20260603_155256.png)

## 9. Rotate the player based on forward input

The camera is rotating perfectly, so let’s make a temporary player script that mirrors the camera’s setup—just to confirm we have input control with the arrow keys. We’ll swap horizontal input for forward input (use .y instead of .x) so Up/Down rotate the player, while Left/Right keep spinning the camera.

[Video](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%225c6c6d28a867%22%5D.body%5B_key==%229f23ef630afa%22%5D.overviewVideo/Unit%204.1%20-%20Step%209%20-%20Rotate%20the%20player%20based%20on%20forward%20input%20-%20FINAL%20NEW_20260625_211900.mp4) ([Transcript (en)](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%225c6c6d28a867%22%5D.body%5B_key==%229f23ef630afa%22%5D.subtitles/Unit%204.1%20-%20Step%209%20-%20Rotate%20the%20player%20based%20on%20forward%20input%20-%20FINAL%20NEW_20260625_212047.vtt))

1. Create a new **PlayerController** script, apply it to the **Player** GameObject, and open it.
2. Copy the setup from **RotateCamera**, but switch **horizontal** to **forward** and use moveInput.y
3. Read the Move action (Vector2) and use the y component to rotate the player around Y.

![](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%225c6c6d28a867%22%5D.body%5B_key==%221cd3bae471d9%22%5D.image/Untitled%203_20260603_155813.png)

## 10. Add forward force to the player

Now let’s turn that temporary rotation into actual forward movement using a Rigidbody and a player speed.

[Video](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%22d37867ef1051%22%5D.body%5B_key==%22e5f871f738a0%22%5D.overviewVideo/Unit%204.1%20-%20Step%2010%20-%20Add%20forward%20force%20to%20the%20player%20-%20FINAL%20NEW_20260625_212214.mp4) ([Transcript (en)](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%22d37867ef1051%22%5D.body%5B_key==%22e5f871f738a0%22%5D.subtitles/Unit%204.1%20-%20Step%2010%20-%20Add%20forward%20force%20to%20the%20player%20-%20FINAL%20NEW_20260625_212356.vtt))

1. Rename the speed field and add a **Rigidbody** reference:
   - Change **rotationSpeed** to **playerSpeed.**
   - Add a private **Rigidbody** field.
2. Get the **Rigidbody** reference in **Awake**. **Awake** is the best place to cache component references because it runs before **Start** and before other scripts might query this GameObject. Start often works, but **Awake** is preferred for setup and dependency gathering.
3. Replace the rotate call with **AddForce** for forward movement

![](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%22d37867ef1051%22%5D.body%5B_key==%220b6ef225700e%22%5D.image/Untitled%202_20260603_163316.png)

## 11. Move in direction of focal point

We’ve got the ball rolling, but it only goes forwards and backwards in a single direction! It should instead move in the direction the camera (and focal point) are facing.

[Video](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%226mPVEs2A9KDZvKF7TiSYUJ%22%5D.body%5B_key==%226mPVEs2A9KDZvKF7TiSYYT%22%5D.overviewVideo/Unit%204.1%20-%20Step%2011%20-%20Move%20in%20the%20direction%20of%20the%20focal%20point%20%28NO%20VO%29%20-%20FINAL%20NEW_20260625_212431.mp4) ([Transcript (en)](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%226mPVEs2A9KDZvKF7TiSYUJ%22%5D.body%5B_key==%226mPVEs2A9KDZvKF7TiSYYT%22%5D.subtitles/Unit%204.1%20-%20Step%2011%20-%20Move%20in%20the%20direction%20of%20the%20focal%20point%20%28NO%20VO%29%20-%20FINAL%20NEW_20260625_212942.vtt))

1. Declare a new **private GameObject focalPoint;** and initialize it in **Awake()**: focalPoint = GameObject.Find("Focal Point");
2. In the **AddForce** call, Replace **Vector3.forward** with **focalPoint.transform.forward**

![](https://storage.googleapis.com/learn-platform-bucket-production/tutorial/4051f786-6617-4481-a710-4e0b76c4dbfc/versions%5B_key==%22yLp09thJhNvnon364cHaMs%22%5D.sections%5B_key==%226mPVEs2A9KDZvKF7TiSYUJ%22%5D.body%5B_key==%226mPVEs2A9KDZvKF7TiSZ1b%22%5D.image/Untitled%202_20260603_163935.png)

**Optional:** Take a moment to experiment with the Global vs Local dropdown menu, and how toggling between the two changes your coordinates and positioning.

![](https://connect-mediagw.unity.com/h1/20231214/learn/images/08f436eb-b052-4623-a97d-1e2f4da5a364_image.png)

## 12. Lesson Recap

## New Functionality:

- Camera rotates around the island based on horizontal input
- Player rolls in direction of camera based on vertical input

## New Concepts and Skills**:**

- Texture Wraps
- Camera as child object
- Global vs Local coordinates
- Get direction of other object

## Next Lesson**:**

- In the next lesson, we’ll add more challenge to the player, by creating enemies that chase them in the game.

## Check your scripts:

RotateCamera.cs

```csharp
using UnityEngine;

public class RotateCamera : MonoBehaviour
{
    public float rotationSpeed = 150f;
    private InputSystem_Actions controls;

    void Awake()
    {
        controls = new InputSystem_Actions();
    }

    private void OnEnable()
    {
        controls.Player.Enable();
        Debug.Log(controls.Player.Move);
    }

    private void Update()
    {
        Vector2 moveInput = controls.Player.Move.ReadValue<Vector2>();
        float horizontalInput = moveInput.x;
        transform.Rotate(Vector3.up, horizontalInput * rotationSpeed * Time.deltaTime);
    }
}
```

PlayerController.cs

```csharp
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float playerSpeed = 150f; 
    private InputSystem_Actions controls;
    private Rigidbody playerRb;
    private GameObject focalPoint;

    void Awake()
    {
        controls = new InputSystem_Actions();
        playerRb = GetComponent<Rigidbody>();
        focalPoint = GameObject.Find("Focal Point");
    }

    void OnEnable()
    {
        controls.Player.Enable();
    }

    void Update()
    {
        Vector2 moveInput = controls.Player.Move.ReadValue<Vector2>();
        float forwardInput = moveInput.y;
        playerRb.AddForce(focalPoint.transform.forward * forwardInput * playerSpeed * Time.deltaTime);
    }
}
```
