Bird
Raised Fist0
Unityframework~10 mins

Obstacle avoidance in Unity - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Obstacle avoidance
Start
↓
Sense obstacles
↓
Is obstacle close?
No→Move forward
Yes↓
Calculate avoidance direction
↓
Change movement direction
↓
Move
↓
Repeat
The agent senses obstacles, decides if it needs to avoid, calculates a new direction, and moves accordingly.
Execution Sample
Unity
void Update() {
  if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, 5f)) {
    Vector3 avoidDir = Vector3.Reflect(transform.forward, hit.normal);
    transform.rotation = Quaternion.LookRotation(avoidDir);
  }
  transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
This code checks for obstacles ahead and changes direction to avoid them while moving forward.
Execution Table
StepRaycast HitObstacle DistanceCondition (hit < 5)ActionMovement Direction
1No-FalseMove forwardForward
2Yes3TrueCalculate avoidDir, rotateAvoidance direction
3No-FalseMove forwardForward
4Yes4TrueCalculate avoidDir, rotateAvoidance direction
5No-FalseMove forwardForward
Exit--No more updatesStop or continue loop-
💡 Loop continues each frame; stops when game ends or object destroyed.
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3After Step 4Final
transform.position(0,0,0)(0,0,0.1)(0,0,0.1)(0,0,0.2)(0,0,0.2)Updated each frame
transform.forward(0,0,1)(0,0,1)Reflected vectorReflected vectorReflected vectorChanges on avoidance
hit.distance--3-4-
avoidDir--(calculated)-(calculated)-
Key Moments - 3 Insights
Why does the object sometimes not avoid obstacles even when close?
Because the raycast might not hit if the obstacle is outside the ray's range or angle, as shown in steps 1 and 3 where no hit occurs.
Why do we use Vector3.Reflect for avoidance direction?
Vector3.Reflect bounces the forward direction off the obstacle's surface normal, giving a smooth avoidance direction (see step 2 and 4 actions).
Why is movement done after rotation?
Rotation changes the facing direction first, so movement forward goes in the new direction, ensuring the object avoids the obstacle effectively.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the movement direction at step 2?
AForward
BBackward
CAvoidance direction
DNo movement
💡 Hint
Check the 'Movement Direction' column at step 2 in the execution table.
At which step does the raycast detect an obstacle at distance 4?
AStep 3
BStep 4
CStep 1
DStep 5
💡 Hint
Look at the 'Obstacle Distance' column in the execution table.
If the raycast range is increased from 5 to 10, how would the execution table change?
AMore steps with 'Yes' raycast hit and avoidance actions
BFewer avoidance actions
CNo change in raycast hits
DMovement direction becomes backward
💡 Hint
Increasing raycast range means detecting obstacles earlier, so more 'Yes' hits in the table.
Concept Snapshot
Obstacle avoidance in Unity:
- Use Physics.Raycast forward to detect obstacles
- If hit within range, calculate avoidance direction with Vector3.Reflect
- Rotate object toward avoidance direction
- Move forward each frame
- Repeat to keep avoiding obstacles dynamically
Full Transcript
In obstacle avoidance, the object uses a raycast to sense obstacles ahead. If an obstacle is detected within a certain distance, it calculates a new direction by reflecting its forward vector off the obstacle's surface. Then it rotates to face this new direction and moves forward. If no obstacle is detected, it continues moving forward. This process repeats every frame to keep the object moving safely around obstacles.

Practice

(1/5)
1. What is the main purpose of obstacle avoidance in Unity game programming?
easy
A. To help objects move without hitting obstacles
B. To make objects jump higher
C. To change the color of objects
D. To increase the speed of objects

Solution

  1. Step 1: Understand obstacle avoidance concept

    Obstacle avoidance is used to prevent objects from colliding with obstacles in their path.
  2. Step 2: Identify the correct purpose

    The main goal is to help objects move smoothly without hitting anything.
  3. Final Answer:

    To help objects move without hitting obstacles -> Option A
  4. Quick Check:

    Obstacle avoidance = prevent collisions [OK]
Hint: Obstacle avoidance means avoiding collisions [OK]
Common Mistakes:
  • Confusing obstacle avoidance with speed control
  • Thinking it changes object appearance
  • Assuming it makes objects jump
2. Which Unity function is commonly used to detect obstacles ahead for avoidance?
easy
A. Update
B. Instantiate
C. Raycast
D. Destroy

Solution

  1. Step 1: Recall Unity functions for detection

    Raycast is used to send an invisible line to detect objects in front.
  2. Step 2: Match function to obstacle detection

    Raycast detects obstacles ahead, while Instantiate creates objects, Update runs every frame, and Destroy removes objects.
  3. Final Answer:

    Raycast -> Option C
  4. Quick Check:

    Obstacle detection = Raycast [OK]
Hint: Raycast checks ahead for obstacles [OK]
Common Mistakes:
  • Choosing Update which runs every frame but doesn't detect
  • Confusing Instantiate with detection
  • Selecting Destroy which deletes objects
3. What will be the output if the following Unity C# code runs and an obstacle is detected by the raycast?
void Update() {
    if (Physics.Raycast(transform.position, transform.forward, out var hit, 5f)) {
        transform.Rotate(0, 90, 0);
        Debug.Log("Obstacle detected, turning right.");
    } else {
        transform.Translate(Vector3.forward * Time.deltaTime * 3);
    }
}
medium
A. The object moves forward continuously without turning
B. The object moves backward
C. The object stops moving and no message is logged
D. The object turns right and logs "Obstacle detected, turning right."

Solution

  1. Step 1: Analyze raycast detection and response

    If the raycast hits an obstacle within 5 units, the object rotates 90 degrees on Y axis and logs a message.
  2. Step 2: Understand else behavior

    If no obstacle is detected, the object moves forward at speed 3 units per second.
  3. Final Answer:

    The object turns right and logs "Obstacle detected, turning right." -> Option D
  4. Quick Check:

    Obstacle detected = turn right + log message [OK]
Hint: If raycast hits, rotate and log; else move forward [OK]
Common Mistakes:
  • Ignoring the rotation when obstacle detected
  • Thinking object stops instead of turning
  • Assuming object moves backward
4. Identify the error in this obstacle avoidance code snippet:
void Update() {
    if (Physics.Raycast(transform.position, transform.forward, 5f)) {
        Debug.Log(hit.distance);
        transform.Rotate(0, 90, 0);
    }
}
medium
A. The Rotate method parameters are incorrect
B. The Raycast method is missing the 'out RaycastHit' parameter
C. The if condition should use '==' instead of parentheses
D. The Update method should be named FixedUpdate

Solution

  1. Step 1: Check Raycast method signature

    Physics.Raycast requires an 'out RaycastHit' parameter to store hit info when using this overload.
  2. Step 2: Verify Rotate and method names

    Rotate parameters are correct for rotation; Update is valid for frame updates.
  3. Final Answer:

    The Raycast method is missing the 'out RaycastHit' parameter -> Option B
  4. Quick Check:

    Raycast needs 'out RaycastHit' [OK]
Hint: Raycast needs 'out RaycastHit' to detect hits [OK]
Common Mistakes:
  • Omitting the out parameter in Raycast
  • Confusing Rotate parameters
  • Thinking Update must be FixedUpdate
5. You want your Unity object to avoid obstacles smoothly by turning gradually instead of instantly. Which approach should you use in your obstacle avoidance script?
hard
A. Use Quaternion.Slerp to rotate smoothly when obstacle detected
B. Use transform.Rotate(0, 90, 0) instantly on detection
C. Stop the object completely when obstacle is detected
D. Ignore obstacles and keep moving forward

Solution

  1. Step 1: Understand smooth rotation methods

    Quaternion.Slerp smoothly interpolates rotation over time, creating gradual turns.
  2. Step 2: Compare with instant rotation

    transform.Rotate(0, 90, 0) turns instantly, which is not smooth.
  3. Final Answer:

    Use Quaternion.Slerp to rotate smoothly when obstacle detected -> Option A
  4. Quick Check:

    Smooth turn = Quaternion.Slerp [OK]
Hint: Use Quaternion.Slerp for smooth turning [OK]
Common Mistakes:
  • Using instant rotation causing jerky movement
  • Stopping object instead of turning
  • Ignoring obstacles completely
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