Seamless transition GUIs are definitely possible. The reason you’re seeing the 1-frame flash occur could be for a number of reasons:
- You are not reparenting the teleport gui after the teleport (this must happen in ReplicatedFirst!).
- You are reparenting the gui, but are destroying it before your code in StarterPlayer has a chance to activate its own loading screen.
This is incorrect. If you do not reparent the custom teleport GUI to the player’s PlayerGui upon arrival, then Roblox will destroy the GUI when it thinks the game has loaded. This may happen before your game’s code can finish initializing and activate your loading screen, causing the 1 frame flash.
Now in order to get this right, here’s what you want to do:
In ReplicatedFirst, write some code that will immediately reparent the teleport gui to the player’s PlayerGui. Next, you’re going to want to wait for your code to finish initializing (in my case I’m waiting for AGF because I know once AGF has “started” it will have created its own loading screen). Finally, you can delete your custom teleport gui.
This is what my ReplicatedFirst code looks like:
local ReplicatedFirst = game:GetService("ReplicatedFirst")
local TeleportService = game:GetService("TeleportService")
local customLoadingScreen = TeleportService:GetArrivingTeleportGui()
local starsLoadingScreen = script:WaitForChild("LoadingScreen"):Clone()
local playerGui = player:WaitForChild("PlayerGui")
starsLoadingScreen.Parent = playerGui
if customLoadingScreen then
customLoadingScreen.Parent = playerGui
ReplicatedFirst:RemoveDefaultLoadingScreen()
if _G.Aero then
customLoadingScreen:Destroy()
else
repeat RunService.Heartbeat:Wait() until _G.Aero
customLoadingScreen:Destroy()
end
end
With this, I can 100% guarantee that the custom loading screen will be destroyed after my UI controller sets up the loading screen (although in this example I clone it directly in from ReplicatedFirst).
(Exclusive to AGF/Knit) I can be sure of this because my UI controller begins animating the proper loading screen within its Init method, not its Start method, so by the time the framework is exposed globally, the loading screen is guaranteed to be visible and animated.
Finally, here is an example of what a seamless teleport looks like (ironically, this example is for a remake of one of your old games):
https://streamable.com/0nh6e1
Hope this helps! I’d be happy to answer any other questions you have.