3DTileset is not displayed

I’m using CesiumForUnreal2.3.0 with UnrealEngine 5.3.
I tried to display GoogleMap, but the following log was recorded and could not be displayed.
When I check the source, it seems that LoadTileset() is repeated without setting _pTileset in ACesium3DTileset::Tick, what could be the cause?

[2025.01.15-01.29.08:577][126]LogCesium: Warning: "Enable World Bounds Checks" in the world settings is currently enabled. Please consider disabling it to avoid potential issues.
[2025.01.15-01.29.08:577][126]LogCesium: Loading tileset from URL https://tile.googleapis.com/v1/3dtiles/root.json?key=XXX
[2025.01.15-01.29.08:577][126]LogCesium: Loading tileset from URL https://tile.googleapis.com/v1/3dtiles/root.json?key=XXX done
[2025.01.15-01.29.08:591][127]LogSpawn: Warning: SpawnActor failed because no class was specified
[2025.01.15-01.29.08:591][127]LogCesium: Warning: "Enable World Bounds Checks" in the world settings is currently enabled. Please consider disabling it to avoid potential issues.
[2025.01.15-01.29.08:591][127]LogCesium: Loading tileset from URL https://tile.googleapis.com/v1/3dtiles/root.json?key=XXX
[2025.01.15-01.29.08:591][127]LogCesium: Loading tileset from URL https://tile.googleapis.com/v1/3dtiles/root.json?key=XXX done
[2025.01.15-01.29.08:605][128]LogSpawn: Warning: SpawnActor failed because no class was specified
[2025.01.15-01.29.08:605][128]LogCesium: Warning: "Enable World Bounds Checks" in the world settings is currently enabled. Please consider disabling it to avoid potential issues.
[2025.01.15-01.29.08:605][128]LogCesium: Loading tileset from URL https://tile.googleapis.com/v1/3dtiles/root.json?key=XXX
[2025.01.15-01.29.08:605][128]LogCesium: Loading tileset from URL https://tile.googleapis.com/v1/3dtiles/root.json?key=XXX done
[2025.01.15-01.29.08:620][129]LogSpawn: Warning: SpawnActor failed because no class was specified
[2025.01.15-01.29.08:620][129]LogCesium: Warning: "Enable World Bounds Checks" in the world settings is currently enabled. Please consider disabling it to avoid potential issues.
[2025.01.15-01.29.08:620][129]LogCesium: Loading tileset from URL https://tile.googleapis.com/v1/3dtiles/root.json?key=XXX
[2025.01.15-01.29.08:620][129]LogCesium: Loading tileset from URL https://tile.googleapis.com/v1/3dtiles/root.json?key=XXX done
[2025.01.15-01.29.08:633][130]LogSpawn: Warning: SpawnActor failed because no class was specified
[2025.01.15-01.29.08:634][130]LogCesium: Warning: "Enable World Bounds Checks" in the world settings is currently enabled. Please consider disabling it to avoid potential issues.
[2025.01.15-01.29.08:634][130]LogCesium: Loading tileset from URL https://tile.googleapis.com/v1/3dtiles/root.json?key=XXX
[2025.01.15-01.29.08:634][130]LogCesium: Loading tileset from URL https://tile.googleapis.com/v1/3dtiles/root.json?key=XXX done
[2025.01.15-01.29.08:648][131]LogSpawn: Warning: SpawnActor failed because no class was specified
[2025.01.15-01.29.08:648][131]LogCesium: Warning: "Enable World Bounds Checks" in the world settings is currently enabled. Please consider disabling it to avoid potential issues.

Hi @mechamosura,

We’ve seen that users have to wait a bit before their Google Maps API key is activated. But if that’s not the issue, then I’m not sure what’s going on. Are you able to stream Google Photorealistic 3D Tiles through Cesium ion instead? There’s an option to add them to your level using the Quick Add panel in the Cesium window.

We recommend that you try upgrading your Cesium for Unreal version, too. v2.3.0 is a year old at this point, and a lot has improved since then.

Thank you for your reply.
I will try to update the version of CesiumForUnreal as this problem has only occurred once and I have not been able to reproduce it.

Hello,

I’m following up on this thread as the issue has occurred again. This time, I was able to gather more specific details about the event, which I’d like to share.

Environment

  • Cesium for Unreal: v2.13.3
  • Unreal Engine: v5.3

Problem Description
When a Cesium3DTileset fails to load, it appears to enter a rapid retry loop, sending a new request to the Google Maps Platform API on every single tick. This behavior quickly exhausts the daily request quota for the 3D Tiles API.

Timeline of Events
Here is a summary of the events based on our logs and Google Maps Platform metrics:

~12:00 PM: The initial load of the tileset began and subsequently failed. At this time, the Google Maps Platform metrics show that our requests were receiving 3xx (Redirection) responses. Following this, the system started retrying the request every tick.

~1:23 PM: We began receiving logs from the Cesium3DTileset.OnCesium3DTilesetLoadFailure delegate.

~1:23 PM: Simultaneously, the Google Maps Platform metrics began reporting 4xx (Client Error) responses. This was likely due to hitting the API request limit, resulting in 429 Too Many Requests errors.

My main point of confusion is the 3xx responses at the beginning of this process. It’s unclear why a redirect would be returned or why it would trigger this persistent failure and retry loop. Any insights would be greatly appreciated.

Hi @mechamosura,

I’m afraid I don’t know what might be going on there. Cesium for Unreal doesn’t automatically retry tileset loads when they fail. But perhaps if “something” is triggering a redirect to the same URL, or ping-ponging between multiple URLs, Cesium for Unreal (really, this would be Unreal Engine’s Http component, not Cesium for Unreal) would keep trying to follow that infinite redirect.

I haven’t personally seen Google Photorealistic 3D Tiles report a 3xx error, though, and I’m not sure what would cause that. You might need to reach out to Google.

Hi @Kevin_Ring
Thank you for the valuable information.

I am currently in contact with Google support regarding this issue.

In the meantime, I’ve implemented a workaround to prevent continuous access to Google Maps in the Tick when the tileset fails to load. I’ve created a custom class that inherits from ACesium3DTileset and made ACesium3DTileset::LoadTileset() and DestroyTileset() protected so I can override them with custom retry logic as follows:

void ACesium3DTilesetCustom::LoadTileset() 
{
    if (retryCount >= MaxRetryCount) 
    {
        UE_LOG(LogCesiumCustom, Warning, TEXT("%s: Max retry count reached. Not attempting to load tileset again."), *GetActorNameOrLabel());
        return;
    }
    else 
    {
        UE_LOG(LogCesiumCustom, Verbose, TEXT("%s: Attempting to load tileset, retry count: %d"), *GetActorNameOrLabel(), retryCount);
    }

    Super::LoadTileset();

    if (!GetTileset()) 
    {
        UE_LOG(LogCesiumCustom, Error, TEXT("%s: Failed to load tileset, retry count: %d"), *GetActorNameOrLabel(), retryCount);
        retryCount++;
    }
}

void ACesium3DTilesetCustom::DestroyTileset() 
{
    UE_LOG(LogCesiumCustom, Verbose, TEXT("%s: Destroying tileset, retry count: %d"), *GetActorNameOrLabel(), retryCount);
    Super::DestroyTileset();
    retryCount = 0; // Reset the retry count when destroyed
}

This implementation prevents the engine from sending an infinite number of requests if the tileset fails to load.

While this doesn’t solve the root cause, I hope it’s a useful temporary measure. I will share any updates here as soon as I have them.