Bird
Raised Fist0
Unityframework~10 mins

Pathfinding basics in Unity - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Pathfinding basics
Start Node
↓
Check Neighbors
↓
Calculate Costs
↓
Choose Next Node
↓
Is Goal Reached?
No→Repeat Check Neighbors
Yes↓
Build Path Back
↓
End
This flow shows how pathfinding starts at a node, checks neighbors, calculates costs, chooses the next node, repeats until the goal is reached, then builds the path back.
Execution Sample
Unity
using System.Collections.Generic;
using UnityEngine;

Vector2Int start = new Vector2Int(0, 0);
Vector2Int goal = new Vector2Int(2, 2);
List<Vector2Int> openList = new List<Vector2Int> { start };
List<Vector2Int> closedList = new List<Vector2Int>();
while (openList.Count > 0) {
  Vector2Int current = openList[0];
  openList.RemoveAt(0);
  if (current == goal) {
    break;
  }
  // Add unvisited neighbors to openList (naive BFS example)
}
This simple loop picks nodes from openList using RemoveAt(0) until it finds the goal. In Unity, Vector2Int represents grid positions for 2D pathfinding.
Execution Table
StepopenListclosedListcurrent NodeActionOutput
1[(0,0)][](0,0)Pop (0,0), check if goalNot goal, add neighbors (0,1),(1,0) to openList
2[(0,1),(1,0)][(0,0)](0,1)Pop (0,1), check if goalNot goal, add neighbors (0,2),(1,1)
3[(1,0),(0,2),(1,1)][(0,0),(0,1)](1,0)Pop (1,0), check if goalNot goal, add neighbors (2,0),(1,1)
4[(0,2),(1,1),(2,0)][(0,0),(0,1),(1,0)](0,2)Pop (0,2), check if goalNot goal, add neighbors (1,2)
5[(1,1),(2,0),(1,2)][(0,0),(0,1),(1,0),(0,2)](1,1)Pop (1,1), check if goalNot goal, add neighbors (2,1),(1,2),(2,2)
6[(2,0),(1,2),(2,1),(1,2),(2,2)][(0,0),(0,1),(1,0),(0,2),(1,1)](2,0)Pop (2,0), check if goalNot goal, add neighbors (2,1)
7[(1,2),(2,1),(1,2),(2,2),(2,1)][(0,0),(0,1),(1,0),(0,2),(1,1),(2,0)](1,2)Pop (1,2), check if goalNot goal, add neighbors (2,2)
8[(2,1),(1,2),(2,2),(2,1),(2,2)][(0,0),(0,1),(1,0),(0,2),(1,1),(2,0),(1,2)](2,1)Pop (2,1), check if goalNot goal, add neighbors (2,2)
9[(1,2),(2,2),(2,1),(2,2),(2,2)][(0,0),(0,1),(1,0),(0,2),(1,1),(2,0),(1,2),(2,1)](1,2)Pop (1,2), check if goalAlready visited, skip
10[(2,2),(2,1),(2,2),(2,2)][(0,0),(0,1),(1,0),(0,2),(1,1),(2,0),(1,2),(2,1)](2,2)Pop (2,2), check if goalGoal reached!
11[][(0,0),(0,1),(1,0),(0,2),(1,1),(2,0),(1,2),(2,1),(2,2)]Build path back from goalPath found
💡 Goal node (2,2) reached at step 10, loop ends.
Variable Tracker
VariableStartAfter 1After 2After 3After 4After 5After 6After 7After 8After 9After 10Final
openList[(0,0)][(0,1),(1,0)][(1,0),(0,2),(1,1)][(0,2),(1,1),(2,0)][(1,1),(2,0),(1,2)][(2,0),(1,2),(2,1),(1,2),(2,2)][(1,2),(2,1),(1,2),(2,2),(2,1)][(2,1),(1,2),(2,2),(2,1),(2,2)][(1,2),(2,2),(2,1),(2,2),(2,2)][(2,2),(2,1),(2,2),(2,2)][][]
closedList[][(0,0)][(0,0),(0,1)][(0,0),(0,1),(1,0)][(0,0),(0,1),(1,0),(0,2)][(0,0),(0,1),(1,0),(0,2),(1,1)][(0,0),(0,1),(1,0),(0,2),(1,1),(2,0)][(0,0),(0,1),(1,0),(0,2),(1,1),(2,0),(1,2)][(0,0),(0,1),(1,0),(0,2),(1,1),(2,0),(1,2),(2,1)][(0,0),(0,1),(1,0),(0,2),(1,1),(2,0),(1,2),(2,1)][(0,0),(0,1),(1,0),(0,2),(1,1),(2,0),(1,2),(2,1),(2,2)][(0,0),(0,1),(1,0),(0,2),(1,1),(2,0),(1,2),(2,1),(2,2)]
Key Moments - 3 Insights
Why do some nodes appear multiple times in the openList?
Nodes can be added multiple times if found from different neighbors before being processed. The execution_table rows 5-9 show repeated nodes like (1,2) and (2,2). The algorithm skips duplicates when popped if already in closedList.
How does the algorithm know when to stop?
It stops when the current node equals the goal node, as shown in step 10 of the execution_table where (2,2) is popped and recognized as the goal.
What happens after the goal is found?
After reaching the goal, the algorithm builds the path back by following parent links (not shown in code), summarized in step 11 of the execution_table.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 4. What nodes are in the openList?
A[(0,2),(1,1),(2,0)]
B[(1,0),(0,2),(1,1)]
C[(0,1),(1,0)]
D[(2,0),(1,2)]
💡 Hint
Check the openList column at step 4 in the execution_table.
At which step does the algorithm first add the goal node (2,2) to the openList?
AStep 7
BStep 6
CStep 5
DStep 10
💡 Hint
Look at the openList column and see when (2,2) first appears.
If the goal was at (3,3), what would happen to the execution_table?
AThe openList would never add neighbors.
BThe loop would continue until (3,3) is reached or openList is empty.
CThe algorithm would stop immediately at step 1.
DThe closedList would remain empty.
💡 Hint
Consider the exit_note and how the loop ends only when the goal is reached.
Concept Snapshot
Pathfinding basics in Unity:
- Use Vector2Int for grid node positions.
- Maintain openList (nodes to explore) and closedList (visited).
- Loop: dequeue current, check goal, enqueue unvisited neighbors.
- Repeat until goal found or no nodes left.
- Reconstruct path using parents.
Full Transcript
This visual execution shows how a pathfinding algorithm works step-by-step in Unity context. It starts at the start node, keeps track of nodes to explore in an open list, and nodes already checked in a closed list. Each step dequeues a node from the open list, checks if it is the goal, and if not, adds its neighbors to the open list (skipping visited). This repeats until the goal node is found. Then the path is built back from the goal using parent pointers. The tables track the open and closed lists, current node, and actions at each step. Key moments explain duplicates in openList and stopping condition. The quiz tests understanding of list contents and conditions. Ideal for beginners learning grid-based pathfinding like BFS or A* foundations.

Practice

(1/5)
1. What is the main purpose of pathfinding in Unity games?
easy
A. To help game objects move from one point to another avoiding obstacles
B. To create visual effects like explosions
C. To manage game audio settings
D. To design user interface layouts

Solution

  1. Step 1: Understand pathfinding concept

    Pathfinding is used to find a route for characters or objects to move smartly in a game world.
  2. Step 2: Identify Unity's use of pathfinding

    Unity uses pathfinding to move game objects from one point to another while avoiding obstacles.
  3. Final Answer:

    To help game objects move from one point to another avoiding obstacles -> Option A
  4. Quick Check:

    Pathfinding = smart movement [OK]
Hint: Pathfinding = smart movement avoiding obstacles [OK]
Common Mistakes:
  • Confusing pathfinding with graphics or audio
  • Thinking pathfinding manages UI
  • Assuming pathfinding creates effects
2. Which of the following is the correct way to set a destination for a NavMeshAgent in Unity?
easy
A. agent.Navigate(target.position);
B. agent.MoveTo(target.position);
C. agent.GoTo(target.position);
D. agent.SetDestination(target.position);

Solution

  1. Step 1: Recall NavMeshAgent method for setting destination

    The correct method to set a destination is SetDestination(Vector3 target).
  2. Step 2: Match method names with options

    Only agent.SetDestination(target.position); uses SetDestination correctly; others are invalid method names.
  3. Final Answer:

    agent.SetDestination(target.position); -> Option D
  4. Quick Check:

    SetDestination sets target [OK]
Hint: Remember NavMeshAgent uses SetDestination() method [OK]
Common Mistakes:
  • Using non-existent methods like MoveTo or GoTo
  • Forgetting to pass target.position as Vector3
  • Confusing method names with other APIs
3. What will be the output of this Unity C# code snippet?
using UnityEngine;
using UnityEngine.AI;

public class MoveAgent : MonoBehaviour {
    public Transform target;
    private NavMeshAgent agent;

    void Start() {
        agent = GetComponent<NavMeshAgent>();
        agent.SetDestination(target.position);
    }

    void Update() {
        if (agent.remainingDistance < 0.5f) {
            Debug.Log("Reached target");
        }
    }
}
medium
A. Logs "Reached target" immediately on start
B. Logs "Reached target" when agent is close to target
C. Throws a runtime error because NavMeshAgent is missing
D. Never logs anything

Solution

  1. Step 1: Understand NavMeshAgent behavior in Start()

    The agent sets its destination to the target's position at start.
  2. Step 2: Check Update() condition for logging

    When the agent is within 0.5 units of the target, it logs "Reached target".
  3. Final Answer:

    Logs "Reached target" when agent is close to target -> Option B
  4. Quick Check:

    Agent logs on close arrival [OK]
Hint: remainingDistance < 0.5 triggers log near target [OK]
Common Mistakes:
  • Assuming log happens immediately
  • Ignoring NavMeshAgent setup requirement
  • Thinking it throws error without NavMeshAgent component
4. Identify the error in this Unity C# code for pathfinding:
public class AgentMover : MonoBehaviour {
    public Transform target;
    private NavMeshAgent agent;

    void Start() {
        agent = GetComponent<NavMeshAgent>();
        agent.SetDestination(target);
    }
}
medium
A. SetDestination requires a Vector3, not a Transform
B. NavMeshAgent component is not assigned
C. Missing Update method to move agent
D. target variable should be private

Solution

  1. Step 1: Check SetDestination parameter type

    SetDestination expects a Vector3 position, but target is a Transform object.
  2. Step 2: Correct usage of SetDestination

    Use target.position to pass Vector3 instead of target directly.
  3. Final Answer:

    SetDestination requires a Vector3, not a Transform -> Option A
  4. Quick Check:

    SetDestination needs Vector3 [OK]
Hint: Use target.position, not target, in SetDestination [OK]
Common Mistakes:
  • Passing Transform instead of Vector3
  • Assuming NavMeshAgent auto-assigns
  • Thinking Update method is mandatory for movement
5. You want a NavMeshAgent to move to a target only if the path is valid and reachable. Which code snippet correctly checks this before moving?
hard
A. if (agent.CalculatePath(target.position, new NavMeshPath()) && agent.SetDestination(target.position)) { /* move */ }
B. agent.SetDestination(target.position); if (agent.pathStatus == NavMeshPathStatus.PathComplete) { /* move */ }
C. NavMeshPath path = new NavMeshPath(); if (agent.CalculatePath(target.position, path) && path.status == NavMeshPathStatus.PathComplete) { agent.SetDestination(target.position); }
D. if (agent.isOnNavMesh) { agent.SetDestination(target.position); }

Solution

  1. Step 1: Understand path validation with CalculatePath

    CalculatePath fills a NavMeshPath object and returns true if path calculation succeeded.
  2. Step 2: Check path status for completeness

    Only if path.status is PathComplete is the path valid and reachable.
  3. Step 3: Set destination only if path is valid

    NavMeshPath path = new NavMeshPath(); if (agent.CalculatePath(target.position, path) && path.status == NavMeshPathStatus.PathComplete) { agent.SetDestination(target.position); } correctly creates a path, checks status, then sets destination.
  4. Final Answer:

    NavMeshPath path = new NavMeshPath(); if (agent.CalculatePath(target.position, path) && path.status == NavMeshPathStatus.PathComplete) { agent.SetDestination(target.position); } -> Option C
  5. Quick Check:

    CalculatePath + PathComplete check = safe move [OK]
Hint: Use CalculatePath and check PathComplete before SetDestination [OK]
Common Mistakes:
  • Ignoring path status after CalculatePath
  • Calling SetDestination without path check
  • Using wrong method signatures
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