Description: A high speed zero-G time trial
racing game inspired by F-zero.
Features custom physics built from the ground up to allow seamless ground and air
controls as well as responsive controls.
Mechanics
Overview
With the ability to seamlessly move from
ground to air each
scenario presents unique challenges for the player. The core philosophy is to give
the player as much control as possible and compensate with that in the level design
by making it as challenging and punishing as possible to make the player fully
utilize their freedom. This is inspired by the way Ultrakill differs from normal FPS
games and how it gives the player maximum control and allows the player to be the
only limiter of how they accomplish a level. The extra challenge leads the player to
a more rewarding sense of accomplishment upon completing the more difficult and
challenging level.
This means that if there was an easier way to implement a functionality but it
removed player agency without introducing a unique challenge then it was immediately
disregarded as it went against the core spirit of the game. This worked as a
challenge to myself during the development, as it let me develop and use systems
that I had not used before, which proved to be a great learning opportunity.
Driving
The driving mechanics were an extreme
challenge for me and
allowed me to become much more familiar with vector math and Unity’s physics system.
The driving is made up of several individual pieces of logic that all work together
to give a smooth driving experience.
The main physics loop of the driving controls goes in order of updating itself on
the normals of what surface it is on. It then uses that information to update the
vehicles offset off the ground, its rotation to align with the ground, and finally
the velocity based on a mixture of player input and physics.
Flying
Flying was even more of a challenge for me,
although the crux
of the problems came this time, in the form of game design. This stemmed from the
core creed of the project being player freedom. I wanted to allow the player to exit
any ramp from any angle, and for the player to be able to have full pivot, yaw and
roll controls. This initially brought a host of issues such as players being able to
simply bypass the track by flying over it and simply making it impossible to design
a track. This system primarily worked by rotating the vehicle first, then
transforming the velocity vector by the rotation, which allowed the player to
essentially rotate their way out of gravity, which just didn’t feel good, and was
impossible to design around and was much harder to add outside force modifiers too.
My solution came in the form of Mario Kart 8
and its gliding
system. I decided to limit the player a little bit by applying a slight drag and
gravity effect that would cause the player to slowly lose velocity and fall
downwards over time as they stayed in the air. Secondly, to fix the problem of being
able to turn out of gravity too easily, I changed the process so that the vehicle's
rotation was changed to face the velocity, and the player input added force to the
current velocity in the direction they input, rather than directly controlling the
vehicle's rotation. I also removed their ability to manually boost when in the air.
This felt much more natural as a player and allowed me to actually design levels
that would challenge a player, while still giving them immense freedom in their
control.
As for maintaining speed on airborne parts
of the track, I
either have another track which they can land on in time to maintain speed, or I use
AirBoost rings. AirBoost rings are rings floating in the air which give the player a
boost of speed when they fly through them. Continually flying through them allows
the player to maintain speed in the air and allows for new exciting and creative
level design opportunities for me to design and develop.
Game Loop and Challenges
With the core control mechanics complete,
the obvious next
step was what type of game this should be. I debated on AI or multiplayer, but
decided that was outside of the scope of this project. I eventually landed on a
simple time trial, which would challenge the player and hopefully make them want to
push the game mechanics to the limit to get the lowest time possible.
Within that, I wanted the player to have to
be more aware of
the track and have to take advantage of the tight controls I had given them. This
was solved, while having a discussion of the game over lunch with a friend who said
the obvious solution, so obvious it had flown right past my head after being head
deep in the project for over a month. That was to add obstacles and a shield to the
player. This was a great learning opportunity for me, and a helpful reminder for my
future projects.
With that, I added in obstacles and a shield
the next day.
With the main obstacles being the walls of the track and round cylinder obstacles
that I could place anywhere on the track. Upon colliding with either, the player
will be slowed down and pushed away from the obstacle, as well as deplete some of
their shield.
With that, I added in obstacles and a shield
the next day.
With the main obstacles being the walls of the track and round cylinder obstacles
that I could place anywhere on the track. Upon colliding with either, the player
will be slowed down and pushed away from the obstacle, as well as deplete some of
their shield.
Menu
For this project I created a menu in order
to allow the user
to choose between the available car models and select which track they want to race
on. This helped deepen my understanding of UI elements and how to make an experience
that is both easy to use for the user and easy for myself to update when adding in
new tracks and cars.
Level
Course Design and Playtest Iteration
The first iteration of the track was made
while developing the
vehicle controller itself, and as such was sort of a mechanics testing ground. I
also made the huge mistake of designing with actual art assets instead of
greyboxing. Due to this, I ran into many issues of the gameplay becoming designed
around the track rather than the track to fit the gameplay, as it was much more
cumbersome to edit and change the track. All around, a big lesson learned.
I did however learn a lot from making this
first failed track
and it helped the production of the second track go much faster. I corrected my
first mistake, by starting first with a greybox of the level, with as minimal detail
as possible. With the gray box, two main objectives were sought after. I first and
foremost attempted to make a fun course that started off narrow, introducing the
player slowly to each mechanic at their disposal. I would then open up more,
diverging into multiple routes, each presenting a unique challenge and focusing on
particular mechanics.
The second objective was having multiple
“visual plateau's”.
These would be parts of the track that naturally created a view of the track, that
builds up the character of the track and gives the player a more grand view of the
track than their usual confined view on the track. Especially, since a tight and low
visibility track was necessary in most places to enforce a sense of speed and
adrenaline.
The first change in this new track was
making it much larger
than the original track had ever been. The point of this game was to go as fast as
possible and challenge the human reaction speed, and it included gliding and speed
boosts that multiplied that challenge. As such, the track needed to be long, such
that it was not able to be cleared in an instant. Jumps would also need to be long
enough that gravity would be significantly pulling down on the player by the time
they reach the next piece of track, except in cases where there were available air
boosts. Areas with air boosts do however require the player to hit most of the
available boost to upkeep momentum and not fall out of the sky.
Environment Art
The level was aesthetically based off of the
planet Crait from
Star Wars Episode VIII, which was my favorite part of the movie. In order to create
concept art, I first took a screenshot from the greybox at a few visual plateaus,
sent them to my ipad, and used them as a base to paint over.
In order to be able to quickly model out the
level, I needed a
way to be able to use assets multiple times across the entire track without worrying
about the texture stretching or scaling inconsistently. In order to achieve this, I
created a triplar shader that would use world coordinates for the UV map. This meant
that no matter the asset, I could scale it and rotate it however I wanted and the
textures world scale would be consistent, and snow would only appear on pixels
facing upwards. I could then mix this with normal maps baked from high poly sculpts
per object if they were available.
Psycho Signals
Game Engine: Unity
Team Size:8
Roles: Environment/Lighting Artist
A beat-em-up inspired by classic TV and Games.
Forgotten
Game Engine: Unity
Team Size:6
Roles:Director, Camera Director, Environment/Lighting Artist
An atmostpheric platformer that has you taking control of a karakasa demon yokai from japanese mythology. You travel through several different levels known as dreams trying to escape the dream realm. This prototype was created as a proof on concept for what we would have wanted to eventually turn into a larger game.