Bird
Raised Fist0
Unityframework~20 mins

State machines for AI behavior in Unity - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
AI State Machine Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this Unity C# state machine code?

Consider this simple AI state machine snippet in Unity C#. What will be printed when the AI transitions from Idle to Chase state?

Unity
using UnityEngine;

public class AIStateMachine : MonoBehaviour {
    enum State { Idle, Chase }
    State currentState = State.Idle;

    void Start() {
        Debug.Log($"Starting state: {currentState}");
        currentState = State.Chase;
        Debug.Log($"Changed state to: {currentState}");
    }
}
AStarting state: Idle
BStarting state: Chase\nChanged state to: Idle
CStarting state: Idle\nChanged state to: Chase
DChanged state to: Chase
Attempts:
2 left
💡 Hint

Look at the order of Debug.Log calls and the initial value of currentState.

🧠 Conceptual
intermediate
1:30remaining
Which state transition is valid in this AI state machine?

Given an AI with states Patrol, Alert, and Attack, which transition is typically valid in a state machine controlling AI behavior?

AAttack → Alert → Patrol
BPatrol → Alert → Attack
CAlert → Patrol → Attack
DAttack → Patrol → Alert
Attempts:
2 left
💡 Hint

Think about how AI usually detects threats and reacts.

🔧 Debug
advanced
2:30remaining
Why does this AI state machine code cause a compile error?

Examine this Unity C# code snippet for an AI state machine. Why does it cause a compile error?

Unity
using UnityEngine;

public class AIStateMachine : MonoBehaviour {
    enum State { Idle, Chase }

    private State currentState;

    void Start() {
        Debug.Log(currentState.ToString());
    }
}
AEnum State is declared after usage causing compile error.
BcurrentState is not initialized before use, so it is null causing NullReferenceException.
CMonoBehaviour cannot have private fields.
DDebug.Log cannot print enum values.
Attempts:
2 left
💡 Hint

Check the declaration order of the enum State and currentState field.

📝 Syntax
advanced
1:30remaining
Which option correctly implements a state transition method in Unity C#?

Choose the correct method to change the AI state from Idle to Chase safely.

Unity
enum State { Idle, Chase }
State currentState = State.Idle;
Avoid ChangeState(State newState) { currentState = newState; }
Bvoid ChangeState(State newState) { currentState = newState(); }
Cvoid ChangeState(State newState) { currentState.equals(newState); }
Dvoid ChangeState(State newState) { if(newState != currentState) currentState == newState; }
Attempts:
2 left
💡 Hint

Remember how to assign values in C# and how to compare values.

🚀 Application
expert
3:00remaining
How many states does this AI state machine have after execution?

Given this Unity C# code for an AI state machine, how many states are stored in the states dictionary after InitializeStates() runs?

Unity
using System.Collections.Generic;
using UnityEngine;

public class AIStateMachine : MonoBehaviour {
    enum State { Idle, Patrol, Chase, Attack }

    Dictionary<State, string> states = new Dictionary<State, string>();

    void InitializeStates() {
        states[State.Idle] = "Idle behavior";
        states[State.Patrol] = "Patrol behavior";
        states[State.Chase] = "Chase behavior";
        states[State.Attack] = "Attack behavior";
        states[State.Patrol] = "Updated Patrol behavior";
    }

    void Start() {
        InitializeStates();
        Debug.Log(states.Count);
    }
}
A3
B5
C1
D4
Attempts:
2 left
💡 Hint

Remember how dictionary keys work when you assign a value to an existing key.

Practice

(1/5)
1. What is the main purpose of using a state machine in AI behavior in Unity?
easy
A. To store player preferences
B. To increase the frame rate of the game
C. To create 3D models automatically
D. To organize AI actions into clear, manageable states

Solution

  1. Step 1: Understand AI behavior organization

    State machines help break down AI actions into distinct states like Idle, Patrol, or Attack.
  2. Step 2: Identify the main benefit

    This organization makes AI easier to manage and debug.
  3. Final Answer:

    To organize AI actions into clear, manageable states -> Option D
  4. Quick Check:

    State machines = organized AI behavior [OK]
Hint: State machines = clear AI steps, not performance boosts [OK]
Common Mistakes:
  • Confusing state machines with performance optimization
  • Thinking state machines store player data
  • Assuming state machines create graphics
2. Which of the following is the correct way to define an enum for AI states in Unity C#?
easy
A. enum AIState { Idle, Patrol, Attack }
B. enum AIState = { Idle, Patrol, Attack }
C. enum AIState: int { Idle, Patrol, Attack }
D. enum AIState() { Idle, Patrol, Attack }

Solution

  1. Step 1: Recall enum syntax in C#

    Enums are declared with the keyword 'enum' followed by the name and curly braces listing values.
  2. Step 2: Check each option

    enum AIState { Idle, Patrol, Attack } uses correct syntax: no equals sign or parentheses, just braces and values.
  3. Final Answer:

    enum AIState { Idle, Patrol, Attack } -> Option A
  4. Quick Check:

    Correct enum syntax = enum AIState { Idle, Patrol, Attack } [OK]
Hint: Enums use braces {} without equals or parentheses [OK]
Common Mistakes:
  • Using '=' sign after enum name
  • Adding parentheses after enum name
  • Incorrect colon usage for enum
3. Given this code snippet, what will be printed if currentState is AIState.Patrol and playerDistance is 3?
enum AIState { Idle, Patrol, Attack }
AIState currentState = AIState.Patrol;
float playerDistance = 3f;
switch (currentState) {
  case AIState.Idle:
    Console.WriteLine("Idle");
    break;
  case AIState.Patrol:
    if (playerDistance < 5) Console.WriteLine("Chase");
    else Console.WriteLine("Patrol");
    break;
  case AIState.Attack:
    Console.WriteLine("Attack");
    break;
}
medium
A. Patrol
B. Idle
C. Chase
D. Attack

Solution

  1. Step 1: Identify current state and player distance

    currentState is Patrol and playerDistance is 3 (less than 5).
  2. Step 2: Follow switch logic for Patrol

    Since playerDistance < 5, it prints "Chase".
  3. Final Answer:

    Chase -> Option C
  4. Quick Check:

    Patrol + distance < 5 = Chase [OK]
Hint: Check conditions inside the matching case block [OK]
Common Mistakes:
  • Ignoring the if condition inside Patrol case
  • Confusing playerDistance comparison operator
  • Assuming default case runs
4. Identify the error in this AI state machine update method:
enum AIState { Idle, Patrol, Attack }
AIState currentState = AIState.Idle;
void Update() {
  switch (currentState) {
    case AIState.Idle:
      Debug.Log("Idle");
      currentState = AIState.Patrol;
    case AIState.Patrol:
      Debug.Log("Patrol");
      break;
  }
}
medium
A. Enum declaration is incorrect
B. Missing break after setting currentState to Patrol
C. Update method should return a value
D. Debug.Log cannot be used inside switch

Solution

  1. Step 1: Check switch cases for breaks

    The Idle case sets currentState to Patrol but lacks a break statement.
  2. Step 2: Understand effect of missing break

    Without break, code falls through to Patrol case, causing both logs to print unexpectedly.
  3. Final Answer:

    Missing break after setting currentState to Patrol -> Option B
  4. Quick Check:

    Missing break causes fall-through [OK]
Hint: Always add break after each case to avoid fall-through [OK]
Common Mistakes:
  • Thinking enum syntax is wrong
  • Expecting Update to return a value
  • Believing Debug.Log is invalid in switch
5. You want an AI to switch from Patrol to Attack only if the player is within 2 units and the AI's health is above 50. Which condition correctly implements this in the state machine update?
hard
A. if (playerDistance <= 2 && health > 50) currentState = AIState.Attack;
B. if (playerDistance > 2 || health <= 50) currentState = AIState.Attack;
C. if (playerDistance <= 2 || health > 50) currentState = AIState.Attack;
D. if (playerDistance >= 2 && health < 50) currentState = AIState.Attack;

Solution

  1. Step 1: Translate requirements to conditions

    AI attacks only if playerDistance is 2 or less AND health is above 50.
  2. Step 2: Match condition with options

    if (playerDistance <= 2 && health > 50) currentState = AIState.Attack; uses '&&' (AND) with correct comparisons: playerDistance <= 2 and health > 50.
  3. Final Answer:

    if (playerDistance <= 2 && health > 50) currentState = AIState.Attack; -> Option A
  4. Quick Check:

    Both conditions must be true for attack [OK]
Hint: Use && for both conditions to be true [OK]
Common Mistakes:
  • Using || instead of &&
  • Reversing comparison operators
  • Confusing greater than and less than
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