Bird
Raised Fist0
Unityframework~5 mins

Waypoint systems in Unity

Choose your learning style10 modes available
Introduction

A waypoint system helps characters or objects move smoothly from one point to another in a game. It makes movement easy to control and predictable.

You want an enemy to patrol along a set path.
You want a character to follow a route automatically.
You want to create moving platforms that follow specific points.
You want to guide a player or NPC through checkpoints.
You want to animate objects moving between fixed locations.
Syntax
Unity
public class WaypointSystem : MonoBehaviour
{
    public Transform[] waypoints;
    private int currentWaypointIndex = 0;
    public float speed = 2f;

    void Update()
    {
        if (waypoints.Length == 0) return;

        Transform target = waypoints[currentWaypointIndex];
        Vector3 direction = target.position - transform.position;
        float step = speed * Time.deltaTime;

        if (direction.magnitude < step)
        {
            currentWaypointIndex = (currentWaypointIndex + 1) % waypoints.Length;
        }
        else
        {
            transform.position += direction.normalized * step;
        }
    }
}

Waypoints are usually stored as an array of Transform objects representing positions in the scene.

The object moves towards the current waypoint, then switches to the next when close enough.

Examples
Declare waypoints array, speed, and track current waypoint index.
Unity
public Transform[] waypoints;
public float speed = 3f;
private int currentWaypointIndex = 0;
Move the object towards the current waypoint each frame.
Unity
void Update()
{
    Transform target = waypoints[currentWaypointIndex];
    Vector3 direction = target.position - transform.position;
    transform.position += direction.normalized * speed * Time.deltaTime;
}
Check if close to waypoint, then move to the next one in a loop.
Unity
if (Vector3.Distance(transform.position, waypoints[currentWaypointIndex].position) < 0.1f)
{
    currentWaypointIndex = (currentWaypointIndex + 1) % waypoints.Length;
}
Sample Program

This script moves a game object smoothly between points set in the waypoints array. It moves towards the current target waypoint each frame. When it gets close enough, it switches to the next waypoint, looping back to the start.

Unity
using UnityEngine;

public class WaypointSystem : MonoBehaviour
{
    public Transform[] waypoints;
    private int currentWaypointIndex = 0;
    public float speed = 2f;

    void Update()
    {
        if (waypoints.Length == 0) return;

        Transform target = waypoints[currentWaypointIndex];
        Vector3 direction = target.position - transform.position;
        float step = speed * Time.deltaTime;

        if (direction.magnitude < step)
        {
            currentWaypointIndex = (currentWaypointIndex + 1) % waypoints.Length;
        }
        else
        {
            transform.position += direction.normalized * step;
        }
    }
}
OutputSuccess
Important Notes

Make sure waypoints are placed in the scene and assigned in the inspector.

Adjust speed to control how fast the object moves.

Use Vector3.Distance or magnitude to check proximity to waypoints.

Summary

Waypoint systems let objects move along set points automatically.

They use arrays of positions and move the object step-by-step each frame.

When close to a waypoint, the system switches to the next point in a loop.

Practice

(1/5)
1. What is the main purpose of a waypoint system in Unity?
easy
A. To change the color of an object randomly
B. To move an object smoothly between predefined points
C. To detect collisions between objects
D. To play sound effects when an object moves

Solution

  1. Step 1: Understand waypoint system concept

    A waypoint system defines points in space for an object to move between.
  2. Step 2: Identify the main function

    The main function is to move objects smoothly from one point to another.
  3. Final Answer:

    To move an object smoothly between predefined points -> Option B
  4. Quick Check:

    Waypoint system = smooth movement between points [OK]
Hint: Waypoints guide movement, not colors or sounds [OK]
Common Mistakes:
  • Confusing waypoints with collision detection
  • Thinking waypoints change object appearance
  • Assuming waypoints handle sound
2. Which of the following is the correct way to declare an array of waypoints in C# for Unity?
easy
A. public Vector3[] waypoints;
B. Vector3 waypoints = new Vector3[];
C. public Vector3 waypoints[];
D. Vector3[] waypoints = Vector3[];

Solution

  1. Step 1: Recall C# array syntax

    In C#, arrays are declared with the type followed by [] before the variable name.
  2. Step 2: Check each option

    public Vector3[] waypoints; uses 'public Vector3[] waypoints;' which is correct syntax.
  3. Final Answer:

    public Vector3[] waypoints; -> Option A
  4. Quick Check:

    Array syntax = type[] name [OK]
Hint: Type[] name is correct array syntax in C# [OK]
Common Mistakes:
  • Placing [] after variable name incorrectly
  • Missing 'new' keyword when initializing
  • Using invalid assignment syntax
3. What will be the output of the following code snippet in Unity C#?
Vector3[] waypoints = {new Vector3(0,0,0), new Vector3(1,0,0), new Vector3(2,0,0)};
int currentWaypoint = 0;
currentWaypoint++;
Debug.Log(waypoints[currentWaypoint]);
medium
A. (2.0, 0.0, 0.0)
B. (0.0, 0.0, 0.0)
C. (1.0, 0.0, 0.0)
D. IndexOutOfRangeException

Solution

  1. Step 1: Understand array and index

    The array has 3 points at indices 0, 1, and 2.
  2. Step 2: Track currentWaypoint value

    currentWaypoint starts at 0, then increments to 1 before logging.
  3. Step 3: Identify logged value

    waypoints[1] is Vector3(1,0,0), so output is (1.0, 0.0, 0.0).
  4. Final Answer:

    (1.0, 0.0, 0.0) -> Option C
  5. Quick Check:

    Index 1 in array = (1,0,0) [OK]
Hint: Increment index before access to get next waypoint [OK]
Common Mistakes:
  • Forgetting index increment
  • Confusing array indices starting at 1
  • Expecting an error due to increment
4. Identify the error in this Unity C# code for moving between waypoints:
public Vector3[] waypoints;
private int currentWaypoint = 0;
void Update() {
    transform.position = Vector3.MoveTowards(transform.position, waypoints[currentWaypoint], 5 * Time.deltaTime);
    if(transform.position == waypoints[currentWaypoint]) {
        currentWaypoint++;
    }
}
medium
A. Using '==' to compare Vector3 positions can cause errors
B. Missing initialization of waypoints array
C. currentWaypoint should decrement instead of increment
D. MoveTowards speed should be negative

Solution

  1. Step 1: Check Vector3 comparison

    Using '==' to compare Vector3 can fail due to floating point precision.
  2. Step 2: Identify correct comparison method

    Use Vector3.Distance or check if distance is very small instead.
  3. Final Answer:

    Using '==' to compare Vector3 positions can cause errors -> Option A
  4. Quick Check:

    Vector3 equality check needs tolerance, not '==' [OK]
Hint: Avoid '==' for Vector3; use distance check instead [OK]
Common Mistakes:
  • Assuming '==' works perfectly for Vector3
  • Ignoring array initialization issues
  • Changing waypoint index direction incorrectly
5. You want an object to move through a list of waypoints and loop back to the first waypoint after reaching the last one. Which code snippet correctly updates the current waypoint index in Unity C#?
hard
A. currentWaypoint = waypoints.Length - currentWaypoint;
B. currentWaypoint = currentWaypoint + 1; if(currentWaypoint > waypoints.Length) currentWaypoint = 0;
C. currentWaypoint = currentWaypoint - 1; if(currentWaypoint < 0) currentWaypoint = waypoints.Length - 1;
D. currentWaypoint = (currentWaypoint + 1) % waypoints.Length;

Solution

  1. Step 1: Understand looping with modulo

    Using modulo (%) with array length loops index back to 0 after last index.
  2. Step 2: Analyze each option

    currentWaypoint = (currentWaypoint + 1) % waypoints.Length; correctly uses modulo to loop index safely within bounds.
  3. Final Answer:

    currentWaypoint = (currentWaypoint + 1) % waypoints.Length; -> Option D
  4. Quick Check:

    Modulo operator loops index correctly [OK]
Hint: Use modulo (%) to loop waypoint index [OK]
Common Mistakes:
  • Using > instead of >= for index check
  • Not resetting index properly causing errors
  • Decrementing index instead of incrementing
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard