One feedback I’ve gotten from a lot of developers I’ve shown the game to, especially with regards to Relativity’s visual style, is that the sky is too empty.
A large part of this has been due to the game’s mechanic. Because you can rotate onto different surfaces, and orientate yourself along any of the 3 main axes, there is no limit in terms of locomotion. In other words, pretty much everything that you can see, you can get to.
For me, in designing the game, I really want to embrace this. I’ve always hated games that prevent you from going somewhere by using invisible walls, or respawning you somewhere else when you step outside of the bounds. For example, in Bioshock Infinite, they’ve created a beautiful world, but you cannot stray from the path the designers intended you to go on. Everytime you try to do that, they’ve placed all thess invisible colliders to stop you. To me, this really irks me as it takes me out of the experience, and makes it not immersive at all.
So in Relativity, I wanted it to be such that, anything the player can see, the player can get to. This means that I can’t really have a skybox showing mountains or other geometry in the distance, because either I would have to create all that geometry, in which case the game becomes too open, or I have to somehow prevent the player from getting there, which breaks the consistency of my logic.
Another design issue I had, once I made it so that the player could go outside and walk around in the exterior of the space, was, “What happens when the player falls off?”
Originally, I just made it so that if the player fell off, the screen would fade to black, and the player would respawn in the last place he was standing at.
You can see that here:
I implemented this mostly because that was how a lot of other games did it.
However, while watching Alexander Bruce’s GDC Talk on the design of Antichamber, one thing really struck me. He talked about how he eliminated death because it made the experience non-immersive. He brings up the example of Portal, which goes to lengths to create an immersive experience, but then you get shot and die, and respawn at a previous checkpoint, which really breaks the immersion.
For me, an important design choice I’ve made has been to eliminate all unnecessary UI. In the game, there are no maps, no inventory, no splash screen, no loading scene. I’ve gone to lengths to create a entirely seamless world, so why am I now having the screen fade to black and have the player respawn? It just didn’t make any sense.
I thought about this, and realized I could get around having to respawn the player by simply having the world wrap around itself. This way, if the player fell off, they would eventually just fall back on the world itself. This meant also that I would solve the issue of having a blank sky, because I would just have repetitions of the world in the sky, like the way things look when you stand between two mirrors.
The way the actual recursive space would work is that I have a trigger below the space, so that when you fell off the world, you eventually hit the trigger, which just teleports you to being above the world.
This is what that looks like (it’s sped up to make the fall faster for the gif):
At first, I started off by duplicating the entire world in the scene, and placing the clone around the space. I soon realized this wasn’t going to work. The minimum number I would need is one along each direction of the axes (positive and negative), as well as in the corners. In other worlds, a 3x3x3 matrix of clones, or 26 (27 minus the one in the center, which is the actual world itself). Hand-placing these in position wasn’t going to work, so I wrote a script to instantiate the clones and place them for me.
However, there was another problem – there was way too much geometry. I couldn’t just simply duplicate the world. That was very inefficient. I had doors, triggers, buttons, colliders, that didn’t need to be there. And everything was getting multiplied by 27. There was so much geometry, in fact, that Unity kept crashing as a result.
So what I did instead was that I deleted all the interactive elements, deleted all the colliders, and then merged the renderers together, so that all I had were 7 mesh renderers (I would have made it all one giant mesh renderer, but merging meshes that were too large would cause Unity to freeze).
Here’s what the clone world looked like after that process:
The different colors are because I colorcode different geometry when building the world, so I can more easily see when things are aligned, etc.
There was still way too much geometry, and Unity was still crashing way too often. And when Unity wasn’t crashing, it was just running ridiculously slow.
I realized I didn’t actually need all the details, and I also didn’t need any of the glass components, since they pretty much weren’t visible.
So what I did instead, was remodel the entire world, but this time, I would just place giant blocks where the rooms and tunnels are, eliminating anything unnecessary, like interiors.
Here’s what the simplified version of the world looks like:
You can see that a lot of the details are removed. However, from a distance, it is barely noticeable. And by the time the player gets close enough to see anything, I’ve already teleported them to above the original world.
Finally, here are some screenshots of what the sky looks like with the recursive space: