Currently our loading screen is part of the website. To ease cross platform development the
screen will be ported and part of unity-renderer
.
Website enables or disables the Loading Screen through some flags in the
global state: show = state.showLoadingScreen || state.waitingTutorial
.
These flags are set from multiple places within kernel. We can differentiate three different flows working with the Loading Scene.
In a normal signin process, the showLoadingScreen
flag is modified in this order:
1) renderer\sagas initializeRenderer.setLoadingScreenVisible => true
2) dcl.ts teleportObservable.setLoadingScreenVisible => true
3) dcl.ts renderStateObservable.setLoadingScreenVisible => false
4) loading\sagas initialSceneLoading.finish => false
In the SignUp process, the showLoadingScreen
flag is modified in this order.
1) renderer\sagas initializeRenderer.setLoadingScreenVisible => true
2) dcl.ts teleportObservable.setLoadingScreenVisible => true
3) session\sagas showAvatarEditor.setLoadingScreenVisible => true
4) dcl.ts renderStateObservable.setLoadingScreenVisible => false
5) session\sagas showAvatarEditor.setLoadingScreenVisible => false
6) dcl.ts renderStateObservable.setLoadingScreenVisible => false
7) session\sagas signUp => true
8) loading\sagas initialSceneLoading.finish => false
9) website.ts loadWebsiteSystems.userAuthentified.ensureRendererEnabled => false
*The waitingTutorial
is modified in this flow as well. It handles the
edge case: User finishes the signup process but the world has not been loaded yet.
When teleporting, the showLoadingScreen
flag is modified in this order:
1) dcl.ts teleportObservable.setLoadingScreenVisible => true
2) dcl.ts renderStateObservable.setLoadingScreenVisible => false
Notice how most of the time the flag is changed reduntantly. In any case I haven't found any conflict in the way they are modified.
The Loading Screen will be ported to Unity as a HUD.
kernel will maintain the ownership of the visibility of the screen. Now, instead of
changing the showLoadingScreen
flag, kernel will send a message to
Unity with the relevant information (LoadingScreen: on|off, IsTeleporting: on|off, Stage: ESTABLISHING_COMMS | COMMS_ESTABLISHED
| EXPERIENCE_STARTED...
)
The website Loading Screen shouldn't be needed anymore. Currently we are
dispatching some events listened by the website about the renderer being loaded.
Although website is reacting properly to this, it's a never reached state since we
don't show the player the Play
or Enter as guest
buttons until the
renderer is ready.
Therefore the whole Loading Screen can be removed from website.
The need of a preloading stage (while loading Unity) is out of this ADR scope. It
would maintain the current implementation of a spinner hiding the
Play/Enter as guest
buttons.
The implementation in Unity is pretty straight-forward. A HUD reacting to the kernel message to show the screen while maintaining all the features of our current implementation (cycling tips, animated progress bar...) should suffice.
Cross platform development can reuse this new loading screen flow almost entirely.
A first step into decoupling the experience lifecycle from kernel to end up moving parts
of our current loading/sagas
responsibilities into Unity.