A Goofy 3D Flight Simulator
Level Design Group Project
!BIRD is a project that I made with two friends, Ethan Godwin and Melody Geiger for our Level Design class. We were inspired by the joke that "birds aren't real" and wanted to make a game where you play as a drone disguised as a bird.
The player must follow instructions from the government to track down and scan suspicious targets located in different parts of a sprawling city.
Development time: 8 weeks
For our Level Design Final, my group and I decided to lean into the goofiness that the main character was a government drone and not an actual bird. We set out early on to create a large city with a major government building residing in the center, but our initial designs went through some major changes as the project progressed.
My contribution for level design began with our layout of the city. The city was to be laid out with three major districts surrounding a central government building. The entire city was to be circular in nature, with the three districts being Downtown, The Park and Residential. I sketched up three initial layouts for the park as a "slice" of our city.
The park went through a few variations, and after mixing and matching layouts with Ethan and Melody I decided that a mix of multiple elements would create a more interesting environment to explore.
Our final layout consisted of the three districts connected via roads, with each district having multiple areas of interest for the player.
I began whiteboxing the park district during the planning stages of our project, and quickly realized that the tools we had access to were a bit limiting for the "slice of pie" approach I had taken to previous mockups.
It was also difficult to add depth to the whitebox without individual assets, so I instead marked out where trees should be placedwith green tiles, blue tiles represented water and brown tiles were the path. Below is a screenshot of the final whitebox of the entire city.
After combining our whiteboxes into a single scene, our main level designer Melody began implementing assets for each district. Once again limited by assets, we decided as a group to shift from the circular city to a more boxy version. To account for the extra quadrant added, districts were expanded with further additions, such as a fair in the park district, a parking lot in the downtown district and extra buildings in the residential district.
Early screenshot of the park/fair area
Early screenshot showcasing flight
Overview of the entire playable city
One of the largest things I worked on as a programmer was the BirdController script, which housed the movement for the bird character as well as logic for checking which camera should be activated. The bird uses WASD to move and space to enter "scope view", which slows the bird and allows the player to look around the scene and scan targets.
I also designed and programmed the scope of the bird as well as it's functionality. There were many iterations and through playtesting and prototyping I settled on two key details for ease of access: clamping the view of the camera and resetting the camera position after each use. Another quality of life adjustment was the inclusion of a changing crosshair if the player is in range and hovering over a scannable NPC. The system will check if the target is correct and display a corresponding UI message.
The bird controller as well as the scope implementation had many challenges to implement, and I had to work very closely with my team members to bugfix, test, and tweak both systems in order to find the right feel for the game while matching the environment. I was in constant communication with my team as we configured the player movement for a large city, made controls more intuitive and combined multiple systems in order to tell a story.
UI message when the incorrect target is scanned.
Target scanned was correct, and the story will continue.
In order for the city to feel more alive, I wrote two scripts to randomly move NPCs around the environment. The first script is GetPoint, which will take a large area of navmesh and choose a point at random within it. Each district has unique gameobjects that utilize the GetPoint script, allowing for each group of NPCs to walk in their specific district instead of randomly across the entire map.
The picture shows the large wiresphere sample areas for selecting points across the navmesh. Each smaller sphere is an NPC.
The second script was titled AI, and was attached to every NPC that I wanted to move around in a specific location. All the AI script does is simply use the randomized location from the GetPoint script and set the NPC's destination to said point.
During playtesting there were many comments on the lack of danger or inability to lose while playing. In the build we used for playtesting, the collisions on buildings and the environment were unable to stop the player, and it was a persisting bug that we couldn't seem to find a fix for. There also arose many questions on how collisions should work, does the player slide across the building? How does that affect momentum? Our solution was that colliding with the environment or going out of bounds would destroy the drone, respawning the player in a set location depending on what district they exploded in. Each of the three locations within the map have set respawn points, but if the player is not within any specific location, they respawn from the government headquarters at the center of the map.
To determine which location the player was in, I used three large colliders with a script that would set a district bool to true when the player entered, and false when exited. Based on these boolean values, the boundary script would choose which respawn point the new player should be instantiated or “respawned” at. Ethan helped with spawning the explosion and coming up with the logic of invoking certain functions in order to have the player respawn slow enough to see the explosion. This helped the collisions to look very clean and a bit humorous to the player. This implementation worked fine, but if I could go back I would clean it up a bit more.
Over the span of this project I learned a lot about working with a team and am overall proud of what we created. I never had much experience whiteboxing or designing a singular level with an entire team before, so it was really good experience for me as a developer. I also learned a lot about scripting and how to workaround some glaring bugs that sometimes are just too time consuming to pour hours into. Collision gave us all some issues, but the destruction of the bird was a clever way to tie into the "birds are drones" joke while solving the issue. I'm most proud at how the targeting and scope turned out for gameplay as well as story wise, further adding to the joke and immersion that you are actually a robotic drone.
The most challenging system to program was character movement. It was by far the most tweaked system of all, and I still didn't quite get it to a place I would have liked by the end of the project. There were many different iterations to movement throughout development, and if I could go back I think I would still tweak the system while adding multiple speeds for the bird to move at.
This project was a blast to work on, and I am grateful to have been a part of such an amazing team! I believe we sold the themes of the game quite well with the aesthetics and everything blended together in the end for such a weird wacky world that's a joy to explore.