Gameplay Programmer
personal projects
click the videos to read more
game project highlights
Hello!
I'm Philip Eriksson and I am a gameplay programmer. My passion for programming is creating incredible gameplay systems and smooth player controllers.I spent a lot of my years enjoying various games which only peaked my interest in video games, not just for their story, but also how they were made. This made me want to start creating video games, so I took a programming course. I enjoyed it so much and wanted to get the best education, which led me to The Game Assembly. (VERY TEMP kommer itereras om FLERA gånger, men vet inte vad jag ska skriva)
specialization project
first person player movement
Why did I make this?
For this 8-week project, I was inspired by Counter-Strike Sources' bunny hop gamemode and Dying Light.I wanted to achieve a high-paced game feel by creating this player controller from scratch in a custom C++ Engine. The engine was originally built from scratch for a school game project.
Features
• 8 directional movement
• Varying speed depending on where you look
• Jump
• Crouch and crouch walk
• Sliding and slide jumping
• Landing assist
• Step-up
• Mantling
• Zipline
Pre-production
The goal of the pre-production phase was to establish a clean working environment. I began stripping away every movement component that I could find and set up my own interface. This was to ensure I had full control of all the systems, and nothing remained of the previous third-person system that had existed before.I chose to implement a state machine architecture to handle all movement. By establishing specific logic for every state, I could create a modular system that is easy to debug and further extend. This structure allowed for smooth transitions and prevented states from accidentally interfering with each other.
To get an accurate visualisation of how well my project will be, I need to define my metrics very fast and make them stick for the rest of the project. I spent significant time comparing with Dying Light to make sure everything felt similar, but faster.During our latest group project, I spent time to create a jump that feels satisfying and very light to use as it was focused on a 3D platformer. That meant I could just modify that code and implement it according to my metrics. I had to alter some functionality to fit the genre of my specialization.

First iteration of running, walking and jumping

First camera preset on landing

With headbob

Without headbob
Headbobbing
This was important to implement as soon as possible, as it could have affected the way I had to tune every feature in the project. It was also crucial to receive feedback on this feature, as head bobbing can cause motion sickness if not executed properly.My first iteration used a sine wave to produce a consistent vertical motion, as well as a cosine wave to produce the horizontal motion. The combined result of these motions was later applied to the camera as an offset to its original position.
The first issue I had was when the character stopped moving, the head bob would just abruptly stop. This caused the head bob curves to instantly reset and made it look jarring and unnatural. I tried resolving this by using a lerp on my timer to make it go down to zero, but it made no greater significance to the feel.Instead of resetting the timer, I added a weight to the curves to smooth out the transition when the head bob activates and deactivates.
I was pleasantly surprised by how simple the code was to implement to give such a meaningful effect.
Alpha phase
During this sprint, I made myself a player gym that was attuned to the metrics of my specialization. I could then start implementing a first draft of the features and transition my camera to the correct state.The first feature I started working on was the dash ability. I find it to be fun to use in any first-person game, as it also has one of the more satisfying camera movements. With the help of a GDC talk about jumping, I could adapt the existing math formula to support a translation over a distance which would give me the desired responsive movement.Using the same formula, I could efficiently implement similar features, such as the slide and the landing assistance. Landing assistance is the result of a roll feature. Due to the uncertainty of being able to implement animations, I decided to cut the roll and add landing assistance as a motion sickness-friendly option.
This was also the time when I implemented camera transitions depending on states, so every state would have its own variables for the camera and its movement. This is something I had to refactor from my preprod phase, as its implementation was not compatible with the future structure of the project.

First iteration of dash

Polished version of dash

Slide with the same math formula as dash

First iteration of crouch

Visual representation of raycasts when mantling

mantling
Beta phase
In the beta phase I spent some time polishing my core features, but I knew I also wanted to enhance the overall second to second experience of the movement. The first thing I wanted to implement was mantling, which allows the player to automatically climb over ledges within reach. The second thing I thought of was some kind of grappling hook or zipline, which I figured would be a fun addition to the movement kit.
I wanted mantling to be a safety net for the player, making sure that you can always make a jump that you just couldn't reach. There are a lot of traps when you start to implement a mantle. You have to be certain that you are able to mantle, which requires multiple checks. You have to check if a ledge is nearby, if something is currently above you that could prevent a mantle, and lastly if the position you want to end up in is safe to stand on. As shown in the image above, I do four checks to make sure it is safe to climb. The first raycast is from the hips and in your forward direction, making sure you are close to climb, then I check far above your head, so you are not hitting anything while climbing up. The third ray checks downwards to give you a position that you want to translate to, and lastly, a raycast upwards from that position, to make sure that you are able to stand or land in a crouch when you climb upwards. ( temp text, vill formulera bättre)
For the grappling hook, I really wanted to capture the feel of Dying Light 1. instead of a swinging hook, I implemented a "zipping hook" where you move from your original position, to the anchor point. The hardest part about the hook is making sure it feels natural and is in check with the current flow. If the hook brings you within range of a ledge, the mantling logic takes over automatically for a smooth transition from zip to climb.

Zipline hook with the ability to be canceled

Zipline hook with auto mantling
Closing phase
The closing phase was centered around polish and visual feedback. Without proper visualisation, the movement and flow can feel disconnected.For the larger portion of the project, I worked with next to no feedback. To improve the game feel, I collaborated with an animator, who provided animations that I could implement in my state machine. This tied everything together and made the movement come to life.Besides tuning animations to match my features, I spent time tackling bugs and improving on every camera preset. With the visual feedback now available, I can also tune every feature to ensure it provides a satisfying experience. I also dedicated the remaining time to documenting and reflecting on the progress of making a first-person controller.

Gameplay featuring slide, zipline and running animation

* visa gameplay med animationer*

gameplay med animation
Conclusion
In the end, I am very happy and proud of what I have managed to deliver. I'm glad I decided to create this project in our custom C++ engine, using the challenges of PhysX and a completely handmade first-person controller. Since I had never worked on a first-person game, this makes me feel even prouder that I have produced something of this quality. I'm very grateful to the people who were not only excited but also happy to help me enhance this project. I want to make this type of movement in a full game and iterate on the existing features, potentially adding new and creative ways to traverse the world.
Thanks to everyone who helped!
Lisa Martijn - Created animations for the player to enhance visual feedbackOscar Hofling - Help with texture and cubemap conversion and pipelineLukas Ax - General feedback on the level design and helping me create a proper levelAnd thanks to everyone else who took time to playtest and provide feedback to
scripted event camera tool
a tool created during the tool development course
Showcase
Purpose
The scripted event camera tool was developed by myself and my co-worker Denis Codreanu with inspirtaion to ease out the scripted events process within our game projects.This tool features a simple interface which took heavy inspiration from mayas keybind and the visuals from unreals sequencer. The goal was that our animators or level designers should have an easy time creating something memorable within our game projects.
Denis and I had a shared interest of making a sequencer, whereas I had more interest in the camera work, and he had more interest in the interface and UI design. So we decided to work together to create something stronger during the tool course.

Tool interface
ImGuizmo preview
Visual Editor with ImGui
One of the most important things Denis and I talked about was having a very clear and easy to use UI. We used ImGui to create a simple yet effective UI with their custom draw commands. With these commands we could create a simple visual editor and space for editing variables.
The biggest thing we could add for this project was a visual indicator of where the camera was and what the camera was moving. We quickly decided to use ImGuizmo due to the compatibility with ImGui and the simple implementation. With this tool, you could easily create and manipulate the camera to the desired direction, rotation or even size that you wanted, creating seemless motion with minimal effort.
Custom file format
To optimize our integration and stability of transfering data between projects we decided to create our own file format where we would serialize all relevant information such as keyframes, frame amount and transformations.We also made our component with a light-work so that we could easily transport the component from our tool solution, to our game project solution without extraordinary work.
With the file format done, we the creator to have a safe way of saving, opening files and restarting, which is why we created a way to do just that during run-time, shown in the video to the right.
Saving and opening a custom file format
undo in action!
Undo-Redo
With a tool created for animating cameras, you are prone to be making some kind of mistake at some point, whether big or small, an undo/redo function is essential.This proved to be more diffuclt than we both thought as there are so many edge-cases that you have to keep track of. Our method for keeping track of the users action was using a vector, and whenever an action was done, we saved the original information, then we pushed it in our vector. If you wanted to redo, all we had to do was pop it and your action was reversed.
Group Projects
In my time at The Game Assembly we have worked regularly in group projects with a team of programmers, artists, animators, technical artists and level designers. We started out with Unity, then moved on to a finished C++ framework, and at last we created our own game engines from scratch in C++.
Mobile Puzzle Game
Production time:
• 6 weeks half time
Engine:
• Unity (editor & engine)
Made at The Game Assembly by:

Team:
• 2 Animators
• 4 Graphical Artists
• 2 Level Designers
• 5 Programmers
my contributions
• UI implementation
• UI animations
• UI optimization
• UI creation


reflections
Flesh in the cogs was the second group project that we made at The Game Assembly. I took on the entire UI implementation for myself during this project as I found it to be really enjoyable in Styx, the first group project. I wanted to make the UI feel more alive with animations as we hade a space themed game. As well as when you use the level select, a specific animation will play for every level that you choose. I felt that handling only UI was not enough to be properly challenged, so I tried to really make it as enjoyable as possible.
project showreel




Auto-Runner Game
Production time:
• 6 weeks half time
Engine:
• Unity (editor & engine)
Made at The Game Assembly by:

Team:
• 2 Animators
• 4 Graphical Artists
• 2 Level Designers
• 5 Programmers
my contributions
• UI implementation
• First iteration of movement
• Collectibles visual feedback

reflections
Styx was our first game project at The Game Assembly, and my first game in Unity. I learned a lot about working in a mainstream game engine, something that was quite unfamiliar to me at first.In the beginning of the project, both to familiarize myself with working in Unity as well as to provide something tangible, I worked on player movement with a co-worker which was successful.I then moved on to working on the UI implementation, a collectibles as well as implementing visual feedback for every collectible.
project showreel




Isometric Hack And Slash Adventure
Production time:
• 6 weeks half time
Engine:
• Unity (editor)
• TGA Custom engine
Made at The Game Assembly by:

Team:
• 2 Animators
• 4 Graphical Artists
• 2 Level Designers
• 5 Programmers
my contributions
• Built 3D Animation pipeline with state machine structure
• Timed animations for all entities
• Implemented shadows and lighting
• Member of the animation, lighting and metrics taskforce


reflections
At the start of this project, I was eager to handle the animations. I saw it as an opportunity to challenge myself and create a working animation pipeline from scratch. I also integrated a lighting and shadow system to enhance the visuals and general feedback of the game. This feature was later cut due to framerate optimization. This was also the first time I have worked with ECS which was difficult to get used to, but also very interesting. I'd be happy to use it again in the future as I believe it was very effecient.
project showreel




Production time:
• 12 weeks half time
Engine:
• Unity (editor)
• TGA Custom engine
Made at The Game Assembly by:

Team:
• 2 Animators
• 4 Graphical Artists
• 2 Level Designers
• 5 Programmers
my contributions
• Full player movement
• Spring movement
• State handling for player
• Quality of life for player
reflections
Unbound is a project that I will hold very close to my heart. It was the first time I could properly create player movement. Since Unbound is a full on movement game, it was important to me that it was well received and easy to use for all players. This could only be acheived by a substansial amount of playtesting and feedback.I had a lot of challenges and a lot of success when implementing new features for Unbound. The biggest challenge was the springs. When using a spring, you would launch yourself upwards, but if you accidentally touched an edge, you could sometimes clip into walls and get stuck, this was solved by extra collision checks and a movement prediction to see where you would land the next frame.I also wanted to create a lot of quality of life features for the player, such as auto-mantling when you are climbing on a wall and get close to an edge. This had to be done carefully, as we had spikes in the game that would kill the player instantly upon touch. I had to do multiple checks to see if the area you climbed upon was safe or not. I also correctly transported the player directly on the ground upon death, so when you respawned, you respawned on the ground and not in the air.As our reference game for this project was Celeste, I wanted to implement a lot of their movement mechanics, but due to the scope of the project, some features were cut and we had to focus on the core movement.
project showreel




3D Precision Platformer
Production time:
• 14 weeks half time
Engine:
• Unreal Engine (editor)
• RNG Engine (Custom built engine)
Made at The Game Assembly by:

Team:
• 2 Animators
• 4 Graphical Artists
• 4 Level Designers
• 7 Programmers
• 4 Technical Artist
my contributions
All Gameplay features including:
• Collectibles and their manager
• Crewmate manager
• Checkpoints
• Level transitions
• Player jump
• Deathzones
• And much more
Custom dialogue on every crewmate
Collectibles spin and pickup
Variable jump height with a maximum and minimal jump
Level transitions between levels
Top-down Action Role-playing game
Production time:
• 14 weeks half time
Engine:
• Unreal Engine (editor)
• RNG Engine (Custom built engine)
Made at The Game Assembly by:

Team:
• 2 Animators
• 4 Graphical Artists
• 4 Level Designers
• 7 Programmers
• 4 Technical Artist
my contributions
• Player abilities
• Camera shake
• Stat system, Force system
• Ability unlocks and buff shrines
• Quality of life for player & various gameplay features
reflections
Spite was the first group project in our own hand-crafted engine and was definetly a joy to work in. The first four weeks of the project was dedicated to build and improve our engine, preparing every pipeline so that we could get a headstart for when production finally began.Once production started I wanted to work on player abilities as soon as possible, as they are the core mechanics of any Diablo-like game. Getting a smooth feel for the controller is the most important part. I also wanted to create bigger systems as I had not endured that challenge yet. I implemented a camera shake system, stat system and our buff system which worked well with our existing stat system. Since we made our own engine I was very interested in lighting and shadows, so I took on that responsibility too.This was a valuable project for learning how to work in a custom made engine and creating everything from scratch. We also introduced Technical Artists in our group and started working with them. This project gave me a lot of insight into their work process and introduced a new workflow between programmers and techincal artists.
project showreel



