Quick answer: The Landscape’s collision response is not set to Block your trace channel. Select the Landscape actor, open its collision settings, and ensure it blocks the channel your line trace or overlap query uses. Also check the Collision Mip Level — a high value produces a coarse collision mesh that misses terrain features.
Here is how to fix Unreal Landscape collision not working. You fire a line trace downward to detect the ground, and it passes right through the Landscape. Characters fall through the terrain. Projectiles ignore the ground. The Landscape is visible, walkable by the player pawn, but invisible to your custom traces. This is almost always a collision channel configuration issue.
The Symptom
Line traces (LineTraceSingleByChannel or LineTraceSingleByObjectType) return no hit when aimed at the Landscape. The player character walks on the terrain normally (the default movement component handles this), but your custom gameplay traces pass through it. In the collision debug view (show collision), the Landscape collision mesh may appear or may be absent depending on the mip level.
In some cases, collision works in flat areas but fails on steep slopes or detailed terrain features. This indicates a Collision Mip Level issue where the collision mesh is too coarse to represent the visual terrain.
What Causes This
1. Collision channel not blocked. The Landscape has collision responses like any other actor. By default, it blocks WorldStatic, Visibility, and Camera channels. If your trace uses a custom channel (ECC_GameTraceChannel1, for example), the Landscape ignores it unless you explicitly set the response.
2. Collision Mip Level too high. The Landscape generates a separate collision mesh from the heightmap. The Collision Mip Level controls its resolution. Level 0 = full resolution. Level 1 = half resolution. Higher levels produce increasingly coarse meshes that may not represent valleys, ridges, or small terrain features.
3. Using wrong trace function. LineTraceSingleByObjectType filters by object type (WorldStatic, WorldDynamic, etc.), not by channel. If you pass the wrong object type, the Landscape is skipped even if its channel responses are correct.
4. Landscape collision disabled. The Landscape component has an “Enable Collision” checkbox. If unchecked, no collision exists at all. This can also happen if you set Collision Enabled to “No Collision” in the details panel.
The Fix
Step 1: Set the Landscape collision response. Select the Landscape actor. In the Details panel, find Collision > Collision Presets. Set it to “Custom” and ensure your trace channel is set to Block:
// If using a custom trace channel, set the Landscape response in code:
// This is typically done in the Landscape's construction or in a level Blueprint
ALandscapeProxy* Landscape = /* your landscape reference */;
if (Landscape)
{
ULandscapeHeightfieldCollisionComponent* Collision =
Landscape->FindComponentByClass<ULandscapeHeightfieldCollisionComponent>();
if (Collision)
{
Collision->SetCollisionResponseToChannel(
ECC_GameTraceChannel1, ECR_Block);
}
}
Step 2: Set Collision Mip Level to 0. Select the Landscape actor. In Details > Collision, set Collision Mip Level to 0 for full-resolution collision. If performance is a concern, use 1 at most:
// Verify collision mesh resolution at runtime
void AMyActor::TestLandscapeTrace()
{
FVector Start = GetActorLocation();
FVector End = Start - FVector(0, 0, 10000);
FHitResult Hit;
bool bHit = GetWorld()->LineTraceSingleByChannel(
Hit, Start, End, ECC_Visibility);
UE_LOG(LogTemp, Log, TEXT("Trace hit: %s, Actor: %s, Distance: %.1f"),
bHit ? TEXT("YES") : TEXT("NO"),
Hit.GetActor() ? *Hit.GetActor()->GetName() : TEXT("none"),
Hit.Distance);
}
Step 3: Use the correct trace function. For channel-based tracing, use LineTraceSingleByChannel. For object-type tracing, use LineTraceSingleByObjectType with EObjectTypeQuery::ObjectTypeQuery1 (WorldStatic) since Landscape is a WorldStatic object.
“The Landscape is just another actor with collision responses. It does not get special treatment from the trace system. If your custom channel is not listed in its collision profile, the trace goes right through.”
Why This Works
Unreal’s collision system is channel-based. Every trace specifies a channel, and every collider specifies how it responds to each channel (Ignore, Overlap, or Block). The Landscape uses the same system as every other actor. When you add a custom trace channel for gameplay (weapon traces, placement checks, etc.), the Landscape’s collision profile has no entry for it and defaults to Ignore. Explicitly setting the response to Block makes the Landscape participate in those traces.
The Collision Mip Level affects only the collision mesh, not the visual mesh. A high mip level saves memory and cooking time but produces a collision surface that floats above valleys and cuts through peaks. For gameplay-critical traces (ground detection, AI navigation), mip level 0 is essential.
Related Issues
If your Landscape collision works but the hit normal is wrong on steep slopes, the coarse collision mip may be approximating the slope angle. Lower the mip level for more accurate normals.
For 3D widget interaction that needs to trace against the Landscape for placement, see Fix: Unreal Widget Component Not Receiving Input for trace channel configuration that affects both UI and world queries.
Custom trace channel? Add it to the Landscape collision profile. Collision Mip Level 0 for accuracy.