Hi there, this is not something that is easy to do. It is quite an innovative mechanic, introducing both new possibilities and new constraints to gameplay.
TL;DR: Two worlds with actual geometry remain available. Normally, only the active world is rendered. When you use the lamp, both worlds render and Umbral is revealed through render stacking, masking, and post-process effects. When you fully enter Umbral, the rendering and gameplay states switch to that world.
-
World & Geometry
- Spatially aligned dual worlds
- Each world has its own geometry and collision
- Both world datasets must remain available and renderable, which requires extensive memory management
-
Advanced Shader Tech
- Rendering states for both worlds
- Masks used when looking into Umbral
- Lighting states
- Complete rendering-state transition when entering Umbral
-
Game State
- Different enemies
- Collision states
- Interactables
- Many other gameplay elements
So there is no a step by step tutorial however as demonstrated its doable or as I call achievable. There are some pros cons to it, or constraints generally and it comes generally because of the production cost.
Pros / Advantages
Innovative mechanic, soft death and increased survivability, visually impressive, traversal puzzles, combat variation, and many other gameplay possibilities.
Cons / Constraints
Parkour-like and corridor-based level structures are generally favoured over true open-world topography. Both worlds need to remain spatially aligned, which limits how independently their layouts can be designed. This could potentially be advanced further through technology, such as changing where geometry exists through different world or rendering states.
There are also rendering, performance, and memory costs, although these can be justified when the mechanic is central to the game.
The complexity of level design, planning, and gameplay also increases significantly. It can sometimes feel slightly procedural because designers have to manage multiple gameplay states, as well as many traversal and collision edge cases.
Edit :
For prototyping, you can do something simple like this:
- Create an Actor Component called
WorldStateComponent .Inside the component, have three enum states:
WorldStateA
HybridState
WorldStateBState A and State B are the main world states. HybridState is the temporary staging state between them.
- Add an input action to the component.On button press:
CurrentWorldState -> HybridStateWhen the player releases the button:HybridState -> PreviousWorldStateYou can use another input to fully move from World A to World B, depending on what your gameplay requires.
- Add an event dispatcher such as:
OnWorldStateUpdatedThis event outputs the current world-state enum.
- Add the component to your player pawn.Fundamentally, this becomes the main gameplay-state logic for the dual-world system.
- Use an MPC, material functions, or custom material parameters to reveal hidden objects during
HybridState .At the same time, enable or disable collision for the required actors and objects.
- During
HybridState , you can use a post-process material to reveal the other world in the camera direction, similar to the game.For a simpler prototype, you can just use a sphere mask that reveals everything inside its radius.
Example:
Player enters an area -> Bridge is broken
Player presses button -> HybridState
OnWorldStateUpdated -> Bridge receives state
Bridge material reveals alternate geometry
Bridge collision becomes active