That’s intended and normal:
In UE, we have many “Timers”, as shown bellow:
- GetAccurateRealTime: Time in Seconds since the application was started. This is accurate to the exact time it is called instead of set once per frame like the other functions
- GetTimeSeconds: Time in Seconds since the world was loaded for allowing gameplay. The value is adjusted by Time Dilation and is also stopped when game is Paused
- GetRealTimeSeconds: Real Time in Seconds since the world was loaded for allowing gameplay. It does not stop when game is Paused, and is not affected by Time Dilation - (I believe this would be the equivalent to our
GetSimulationElapsedTime())- GetGlobalTimeDilation: Get the Current Time Dilation of the Simulation
- GetGameTimeinSeconds: Get the Game Time in Seconds (Game Time does not advance when game is Paused) - Cool but we don’t need in fortnite haha
- GetWorldDeltaSeconds: Returns the World Simulation Delta Time. Adjusted by Time Dilation
There is also some others such as
GetAudioTimeSeconds,GetPlatformTimeSeconds, many other custom clocks/timer counters and so on…
What you want is the GetAccurateRealTime from UE. It starts when the client app is opened and never stops, being different for every player connected. (Time Node in Materials does the same - It was not meant for sync between clients or animations across network).
Sadly, we don’t have these timing functions in verse. The only one we have in UEFN/Verse is GetSimulationElapsedTime() (API Docs Here). It is similar to the GetRealTimeSeconds() or GetTimeSeconds() from UE.
Instead of being since the application starts, it is since the world simulation is started, it runs on the server, being the same for everyone (Server replicates its correct values to the connected clients)
And, even if we had these other time query functions, it would STILL not work: Server and Client starts at different times, plus, different clients have different times that are not the same across all clients.
The server time is accurate to all clients when replicated, but can’t do the inverse - Client time is not replicated to server and not accurate to sync data.
From what I see, you want to implement custom client-side animations. There is some alternative approaches to achieve it:
-
Replace Time Node in the Material with a new Float Parameter - Then update that float param every tick inside verse (It works, but currently it would be limited due to network latency and 30TPS max updates)
-
Use a Cinematic Sequencers with the desired animations - You can drive the params directly in the material, or use MPCs (Material Parameter Collections) to control multiple instances of that material in your world. Use this if you want smooth client-side animations with less effort on the current state.
-
Wait for Future Tech - Verse will soon receive Client-Side code prediction and Live Variables - This will fix and improve the limitations related to network latency and possibly also max tick speed… (So you can implement the first method without these side effects)
I know this may not be the answer you were expecting, but I hope I could help in some ways…
(Note: Related topic for future references)