UE4 World Size Problem
I’ll jot down a problem I encountered in content I was recently creating.
In that content, I was driving a car using WheeledVehicle, and recently I significantly expanded the driving area.
When I tested if it worked properly, the car disappeared around the 10km mark….
I was worried that the processing might become heavy due to the area being too large, but I didn’t imagine the car would suddenly disappear.
So, I investigated various things and found the cause and solution.
WorldSettings’ Enable World Bounds Checks
First, an easy way to solve this issue is to turn OFF Enable World Bounds Checks
in WorldSettings.
(I found this while searching around, but I can’t find the original page anymore…)

Turning this item OFF indeed prevents the car from disappearing even beyond 10km.
Why? What does this item affect? With these questions in mind, I investigated a bit further.
In the Editor, hovering the mouse over this item displays a tooltip like the image below.

Hm? What’s CheckStillInWorld
? Searching the Engine source, I found a function called AActor::CheckStillInWorld
. This looks suspicious.
bool AActor::CheckStillInWorld()
{
if (IsPendingKill())
{
return false;
}
UWorld* MyWorld = GetWorld();
if (!MyWorld)
{
return false;
}
// Only authority or non-networked actors should be destroyed, otherwise misprediction can destroy something the server is intending to keep alive.
if (!(HasAuthority() || Role == ROLE_None))
{
return true;
}
// check the variations of KillZ
AWorldSettings* WorldSettings = MyWorld->GetWorldSettings( true );
if (!WorldSettings->bEnableWorldBoundsChecks) // Check if world bounds checks are enabled
{
return true; // If disabled, return true (actor is considered within bounds)
}
if( GetActorLocation().Z < WorldSettings->KillZ )
{
UDamageType const* const DmgType = WorldSettings->KillZDamageType ? WorldSettings->KillZDamageType->GetDefaultObject<UDamageType>() : GetDefault<UDamageType>();
FellOutOfWorld(*DmgType);
return false;
}
// Check if box has poked outside the world
else if( ( RootComponent != nullptr ) && ( GetRootComponent()->IsRegistered() == true ) )
{
const FBox& Box = GetRootComponent()->Bounds.GetBox();
if( Box.Min.X < -HALF_WORLD_MAX || Box.Max.X > HALF_WORLD_MAX ||
Box.Min.Y < -HALF_WORLD_MAX || Box.Max.Y > HALF_WORLD_MAX ||
Box.Min.Z < -HALF_WORLD_MAX || Box.Max.Z > HALF_WORLD_MAX )
{
UE_LOG(LogActor, Warning, TEXT("%s is outside the world bounds!"), *GetName());
OutsideWorldBounds(); // Call function when outside bounds
// not safe to use physics or collision at this point
SetActorEnableCollision(false);
DisableComponentsSimulatePhysics();
return false;
}
}
return true;
}
The answer was written at the very end of the function.
const FBox& Box = GetRootComponent()->Bounds.GetBox();
if( Box.Min.X < -HALF_WORLD_MAX || Box.Max.X > HALF_WORLD_MAX ||
Box.Min.Y < -HALF_WORLD_MAX || Box.Max.Y > HALF_WORLD_MAX ||
Box.Min.Z < -HALF_WORLD_MAX || Box.Max.Z > HALF_WORLD_MAX )
{
UE_LOG(LogActor, Warning, TEXT("%s is outside the world bounds!"), *GetName());
OutsideWorldBounds();
Here, the Actor’s position is checked, and if the coordinates exceed HALF_WORLD_MAX
, OutsideWorldBounds()
is called.
Looking inside OutsideWorldBounds(), it only contained Destroy();
.
This is it!!!
The definition of HALF_WORLD_MAX is as follows:
#define WORLD_MAX 2097152.0 /* Maximum size of the world */
#define HALF_WORLD_MAX (WORLD_MAX * 0.5) /* Half the maximum size of the world */
Ah, it’s about 10km. That confirms it.
So, without changing the settings, the maximum possible distance range is from -10km to +10km, a total length of 20km. (You could make it a bit longer using the diagonal).
How do you create a world larger than this? Turning OFF Enable World Bounds Checks
feels irregular, so maybe you separate the World? I’m curious, so I’ll investigate further.