Bird
Raised Fist0
Unityframework~10 mins

Raycasting for detection in Unity - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - Raycasting for detection
Start
Cast Ray from origin
Check if Ray hits object?
NoNo detection
Yes
Get hit info
Use hit info for detection
End
The program casts a ray from a point, checks if it hits an object, and if yes, uses the hit information for detection.
Execution Sample
Unity
Ray ray = new Ray(origin, direction);
if (Physics.Raycast(ray, out RaycastHit hit, maxDistance)) {
    Debug.Log("Hit: " + hit.collider.name);
} else {
    Debug.Log("No hit");
}
This code casts a ray from origin in a direction and logs the name of the object hit or 'No hit' if nothing is detected.
Execution Table
StepActionRaycast ResultHit InfoOutput
1Create Ray from origin (0,0,0) towards (0,0,1)N/AN/AN/A
2Cast Ray with maxDistance=10HitCollider name: WallLog: Hit: Wall
3Use hit info for detectionN/ACollider name: WallDetection successful
4EndN/AN/AProgram ends
💡 Raycast hits an object named 'Wall' within maxDistance, so detection succeeds.
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3Final
raynullRay(origin=(0,0,0), direction=(0,0,1))SameSameSame
hitnullnullRaycastHit(collider=Wall)SameSame
outputnullnullnull"Hit: Wall""Hit: Wall"
Key Moments - 2 Insights
Why does the raycast sometimes not detect any object even if one is in front?
Because the raycast has a maxDistance limit; if the object is farther than maxDistance, the raycast returns no hit (see execution_table step 2).
What does 'out RaycastHit hit' mean in the raycast call?
It means the method will fill the 'hit' variable with information about the object hit if any, as shown in execution_table step 2 where 'hit' stores collider info.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 2, what is the name of the object hit by the ray?
AWall
BFloor
CNo object
DPlayer
💡 Hint
Check the 'Hit Info' column at step 2 in the execution_table.
At which step does the program confirm that the raycast did not miss?
AStep 1
BStep 2
CStep 3
DStep 4
💡 Hint
Look at the 'Raycast Result' column in the execution_table.
If maxDistance was set to 5 but the object is 8 units away, what would change in the execution_table?
AOutput would be 'Hit: Wall'
BHit Info would still show 'Wall'
CRaycast Result would be 'No Hit' at step 2
DNo change
💡 Hint
Consider how maxDistance limits detection as explained in key_moments.
Concept Snapshot
Raycasting sends an invisible line (ray) from a point in a direction.
If the ray hits an object within maxDistance, it returns hit info.
Use Physics.Raycast(ray, out hit, maxDistance) to detect objects.
Check the boolean result to know if something was hit.
Hit info includes collider and position for detection logic.
Full Transcript
This lesson shows how raycasting works in Unity for detecting objects. First, a ray is created from an origin point in a direction. Then, Physics.Raycast is called with this ray and a maximum distance. If the ray hits an object within this distance, the method returns true and fills a RaycastHit variable with details about the hit object. The program can then use this information, for example, to log the object's name or trigger game logic. If no object is hit, the method returns false and the program can handle that case accordingly. The execution table traces these steps, showing the ray creation, casting, hit detection, and output. Variables like 'ray', 'hit', and 'output' change as the program runs. Key moments clarify common confusions like the role of maxDistance and the meaning of the 'out' parameter. The visual quiz tests understanding of the hit object, detection step, and effect of maxDistance. The snapshot summarizes the core idea: raycasting is a way to detect objects by sending a line and checking what it hits.

Practice

(1/5)
1. What does raycasting do in Unity?
Raycast is often used to:
easy
A. Send an invisible line to detect objects in a direction
B. Create a visible laser beam effect
C. Change the color of an object
D. Play a sound when an object is clicked

Solution

  1. Step 1: Understand raycasting purpose

    Raycasting sends an invisible line (ray) from a point in a direction to detect objects.
  2. Step 2: Identify correct use

    It is used to check if something is hit by this invisible line, like obstacles or targets.
  3. Final Answer:

    Send an invisible line to detect objects in a direction -> Option A
  4. Quick Check:

    Raycasting = Detect objects with invisible line [OK]
Hint: Raycasting detects objects by sending invisible lines [OK]
Common Mistakes:
  • Thinking raycasting creates visible effects
  • Confusing raycasting with changing object properties
  • Assuming raycasting plays sounds
2. Which of the following is the correct way to start a raycast in Unity C#?
easy
A. Physics.CastRay(origin, direction, hit, maxDistance);
B. Physics.RayCast(origin, direction, hit, maxDistance);
C. Physics.Raycast(origin, direction, out hit, maxDistance);
D. Physics.Raycast(origin, direction, hit, maxDistance);

Solution

  1. Step 1: Recall correct method name and parameters

    The correct method is Physics.Raycast with parameters: origin, direction, out hit, maxDistance.
  2. Step 2: Check syntax correctness

    Only Physics.Raycast(origin, direction, out hit, maxDistance); uses the exact method name and includes out keyword for hit parameter.
  3. Final Answer:

    Physics.Raycast(origin, direction, out hit, maxDistance); -> Option C
  4. Quick Check:

    Correct method and out parameter = Physics.Raycast(origin, direction, out hit, maxDistance); [OK]
Hint: Remember 'out' keyword for hit in Physics.Raycast [OK]
Common Mistakes:
  • Misspelling method name as CastRay or RayCast
  • Omitting 'out' keyword for hit parameter
  • Passing hit without 'out' keyword
3. What will be the output of this code snippet?
RaycastHit hit;
if (Physics.Raycast(transform.position, transform.forward, out hit, 10f)) {
    Debug.Log(hit.collider.name);
} else {
    Debug.Log("No hit");
}

Assuming there is an object named "Target" 5 units ahead in the forward direction.
medium
A. "No hit"
B. "Target"
C. NullReferenceException
D. Empty string

Solution

  1. Step 1: Understand raycast parameters and scene setup

    The raycast starts at the object's position and goes forward 10 units. Since "Target" is 5 units ahead, it will be hit.
  2. Step 2: Analyze output

    Because the ray hits "Target", hit.collider.name will be "Target" and printed.
  3. Final Answer:

    "Target" -> Option B
  4. Quick Check:

    Ray hits object named Target = Output "Target" [OK]
Hint: If object is within distance, raycast hits it [OK]
Common Mistakes:
  • Assuming no hit if object is closer than maxDistance
  • Expecting error instead of hit name
  • Confusing hit.collider.name with hit.transform.name
4. Identify the error in this raycasting code:
RaycastHit hit;
if (Physics.Raycast(transform.position, transform.forward, hit, 10f)) {
    Debug.Log("Hit detected");
}
medium
A. Missing 'out' keyword before hit parameter
B. Wrong method name 'Raycast' should be 'CastRay'
C. transform.forward is invalid direction
D. RaycastHit cannot be used with Physics.Raycast

Solution

  1. Step 1: Check method signature

    Physics.Raycast requires the hit parameter to be passed with the 'out' keyword.
  2. Step 2: Identify missing keyword

    The code passes 'hit' without 'out', causing a compile error.
  3. Final Answer:

    Missing 'out' keyword before hit parameter -> Option A
  4. Quick Check:

    Missing 'out' causes error = Missing 'out' keyword before hit parameter [OK]
Hint: Always use 'out' before hit in Physics.Raycast [OK]
Common Mistakes:
  • Omitting 'out' keyword
  • Changing method name incorrectly
  • Using invalid direction vector
5. You want to detect only objects on the "Enemy" layer using raycasting. Which code snippet correctly does this?
hard
A. int layerMask = LayerMask.NameToLayer("Enemy"); if (Physics.Raycast(origin, direction, out hit, maxDistance, layerMask)) { // hit enemy }
B. int layerMask = 1 << LayerMask.NameToLayer("Enemy"); if (Physics.Raycast(origin, direction, out hit, maxDistance)) { // hit enemy }
C. int layerMask = 1 << LayerMask.NameToLayer("Player"); if (Physics.Raycast(origin, direction, out hit, maxDistance, layerMask)) { // hit enemy }
D. int layerMask = LayerMask.GetMask("Enemy"); if (Physics.Raycast(origin, direction, out hit, maxDistance, layerMask)) { // hit enemy }

Solution

  1. Step 1: Understand layer mask creation

    LayerMask.GetMask("Enemy") returns a mask for the "Enemy" layer correctly for raycasting.
  2. Step 2: Eliminate incorrect options

    int layerMask = 1 << LayerMask.NameToLayer("Enemy"); if (Physics.Raycast(origin, direction, out hit, maxDistance)) { // hit enemy } calculates the layer mask correctly but fails to pass it to the Raycast method, so it detects all layers. int layerMask = 1 << LayerMask.NameToLayer("Player"); if (Physics.Raycast(origin, direction, out hit, maxDistance, layerMask)) { // hit enemy } uses the "Player" layer mask instead of "Enemy". int layerMask = LayerMask.NameToLayer("Enemy"); if (Physics.Raycast(origin, direction, out hit, maxDistance, layerMask)) { // hit enemy } uses LayerMask.NameToLayer("Enemy") without bit shift, creating an invalid layer mask (index instead of bitmask).
  3. Final Answer:

    int layerMask = LayerMask.GetMask("Enemy"); if (Physics.Raycast(origin, direction, out hit, maxDistance, layerMask)) { // hit enemy } -> Option D
  4. Quick Check:

    Use LayerMask.GetMask for correct layer mask [OK]
Hint: Use LayerMask.GetMask("LayerName") for raycast layer filtering [OK]
Common Mistakes:
  • Using NameToLayer without bit shift
  • Using wrong layer name
  • Not applying layer mask in raycast