Lead scripter | Game designer | Scrum master
Genre: Puzzle Horror
Language: Blueprint Visual Scripting
Development time: 4 Weeks
Team: 3 game designers + 6 3D artists + 2 2D artist
- Script object interactions
- Script player movement
- Script puzzles
- Hold morning meetings
- Create and maintain backlog
Many of us remember what power our imagination held as a child, but we also remember how it worked against us. The dark: something relatively harmless all things considered, can be the end of a small child, as it houses all sorts of hideous monsters. How would you feel if you were to step back into the shoes of that frightened child?
Night Terrors is a VR puzzle horror game where you play as a preschooler trying to elude a terrifying monster hiding in the nooks and crannies of your home. To escape, you need to explore your surroundings through the eyes of a child, solving puzzles and overcoming your fear.
As scrum master, I learned a lot about long term planning in a game project. I learned to estimate the work needed for features, to prioritize and create reachable goals. I gained a lot of experience to create a common vision for all team members to work towards.
Grabbing and pickup items
We wanted to have a robust and believable grabbing and pickup system in our game that enabled players to interact with objects and solve puzzles with them. A problem in VR is that there isn’t a way to stop the player’s hand from moving through obstacles or reaching inside, for example, a locked box. We wanted a system that didn’t feel weird for the player but stopped them from reaching inside things and pull them out.
My solution was to use Unreal’s physics engine for this interactions. With physics handles the physics engine takes care of moving items around. The grabbed items collide and interact with other objects within the physics engine and create a realistic and immersive experience. This stopped the player from pulling items through other items or obstacles
You can read more about the development process of this feature in this development post.
Drawers, doors, stools and much more…
The approach with physics handles that was used for the grab and pickup system proved to be robust and flexible enough to be used for all kinds of interactions. To restrict movements of different interactable objects we ignored the rotation of the player’s hand and used physics locks and physics constraints to limit the angular or linear movement in the different axis.
A drawer, for example, has one linear limit along the axis it is opened in, a stool, too big for a child to lift, was locked in the vertical axis to simulate that it was dragged around on the floor by the player.
This created a flexible system that quickly could be used or extended to create any interactable item that was needed in the game. This decreased development time for new features and was adaptable to many situations. This solution became widely used within the other game projects and helped to speed up development for many teams.
Moving around in VR can be a tricky thing. Virtual reality sickness is a serious problem to solve when creating a VR game. We decided to implement a teleportation system to prevent the players from feeling sick since it has been shown to help with this problem.
We then had another problem. If the player could teleport anywhere, how do we restrict the movement of the player? The core mechanic of the game is for the player to solve puzzles to unlock new areas to progress. We also had ideas of players climbing furniture to reach new heights. We needed to create a system that would accommodate all these requirements while still being easy enough for the level designers to use and understand.
To solve all these problems I created a system that consisted of three parts.
- A script that calculates the teleportation location based on an arc trace.
- A teleportation zone that could be locked or unlocked for teleportation.
- A teleport object with a script that returned a teleport location
One script calculated the teleport location based on an arc trace from the player’s hand. If that trace hit an object the script then checked if that object had a special teleport object script on it. If the object had the teleport script the teleport location was returned from that script. The teleport location was given by the location of the hit location of the arc trace. Last of all the system checked if the teleport location was within a locked teleport zone. If a locked zone was detected the teleportation was denied, if not the teleport was approved.
- Find teleport location from arc trace
- Check if hit object have teleport script
- YES – Get teleport location from script
- NO – If the object is tagged “Teleportable” get teleport location from the trace
- Check if teleport location is within locked teleport zone
- YES – Don’t teleport
- Teleport OK!
Progression in Night terrors consists of the player solving a puzzle that unlocks the next area of the room. A puzzle could be a very simple thing, like finding and pressing a button, to more complex puzzles that consist of many steps that the player needs to finish in a certain order.
For this to work in our game I created a system that used Unreal’s event system to communicate when tasks or parts of the puzzle were completed. We then set up listeners for this event and when they occur upon completion of the puzzle, the listener did the necessary actions in order for the player to progress.
We set up all these listeners and interaction in the level blueprint. This allowed for a good abstraction level and avoided many dependency problems. Puzzles could be set up fast and level progression was controlled from one location. This made it easy to overview and edit and was beneficial for the level designer that could work more efficiently.