Onibi: Lost Spirits
Gameplay Programmer/Technical Designer
Project Overview
You are Sanzu, a soul that has been resurrected into the body of a Shikigami paper doll with a purpose: To help guide three lost souls across the Sanzu river into the afterlife.
As you meet each spirit, they offer you their power in order to aid your journey across the Sanzu. Huuka, a young soul, gives Sanzu the ability to jump and telepathically lift objects. Rai, a former monk's soul, gives Sanzu the ability to see in dark spaces, as well as being able to burn away obstacles. Inari, a fox spirit, is able to bring objects too and from the spirit realm, allowing Sanzu to pass through some physical objects, or make spirit objects physical
What I did
This project was a collaborative effort with 2 other designers, as well as 9 other programmers. My focus on this project was Gameplay Programming. I was in charge of creating the player controller, as well as implementing the telekinesis mechanic. With these focuses in mind, these were my primary contributions to the project:
- Movement controller
- Telekinesis Mechanic
- Mechanic design
- QA testing/debugging
What Went Well
Player Controller
Overall I'm fairly happy with the way the player controller feels, it's "floaty" in a way that feels appropriate for a spirit/paper doll, but controllable enough to facilitate platforming with relative ease. The controls made using the multiple spirit abilities fairly simple for the player to understand, and simple enough to easily design a tutorial for it.
Sanzu Player Controller

Telekinesis Mechanic

Telekinesis Mechanic
The telekinesis mechanic went through the most iterations of any of my other contributions to this project. There were many moments where bugs caused strange and seemingly unavoidable issues. The reason this is in the "What Went Well" category is actually because I was able to make it feel smooth and work well, avoiding all issues from previous iterations using linear algebra and box tracing(things I had not yet used in a game setting). The end result was notably satisfying to many of the play-testers, and became an integral mechanic to all of the levels and puzzles.
Mechanic Design
Throughout this project I felt many of my design contributions benefited the team greatly. I was able to come up with ideas for all of the main spirit abilities, and was even able to point other programmers in the right direction for how they could be implemented in game(this had been all of our first projects in Unreal Engine). This was great experience for me as a Technical Designer, as it gave me an opportunity to communicate ideas and provide prototypes between the programmers and designers.
Telekinesis Second Type


All of the above logic went through several iterations/implementations, ultimately providing me with plenty of opportunity to grow my skills in both design in programming. This was my first project in Unreal Engine, and while I did not dip my toes into C++ on this project, I was able to get very comfortable in the engine, and in a later project (Bring On The Bling), I was able to use C++ in tandem with Blueprints.
Development Challenges
Though I am proud of the shape my contributions have taken now that they are mostly finalized, throughout the project I was met with several challenges that for a time had me hitting a wall. Here are the major challenges I faced and how I overcame them:
Learning Unreal Engine
Throughout prior projects I had worked primarily on custom C++ engines(including one I assisted in creating from the ground up), as well as Unity. That said, this project was my first attempt at using Unreal Engine 5, and as such there was a learning curve. I was able to get the main hang of things by the second week, but despite knowing how to develop in Unreal by that point, I hesitated to attempt to use C++, as I had heard it was very complicated within Unreal, and I did not want to hold my team back in the process of learning C++ while developing integral mechanics for them. Thankfully I was able to get later experience with C++ in Unreal on a separate project. My team and I also had some issues with conflicts with SVN version control, which were solved by putting write locks on files as developers worked on them, as well as coordinating when each file would be needed by a developer to prevent stepping on team member's toes.
Telekinesis Debugging
The second major challenge I faced was the creation of the telekinesis mechanic. On it's initial implementation, I was able to get a functioning mechanic that enabled simple movement of an object through frame-by-frame position adjustment. This ended up acting more akin to many small teleports than an object smoothly moving through space. Because the position the object would be set to was simply the players forward vector multiplied by distance, the player could simply move the object through a wall or the floor, as collisions didn't apply to the teleporting nature of the implementation.
Due to this, there were many cases where players would accidentally lose objects required to complete the level. This issue also ended up contributing to the mechanic feeling very static and light, as opposed to the weightiness one would expect from lifting a large object into the air. To remedy this, I had to make a few major changes to how the mechanics worked.
Firstly, I needed to approach the movement differently. Initially I had attempted to add acceleration or velocity to the object in the direction the player intended to move it to, as opposed to teleporting the object every frame. This however created issues with gravity, as well as constantly attempting to add more speed to an object pushed up against a wall until the object would successfully glitch through, effectively negating this change. I eventually settled on a system for movement that would act similarly to the teleporting position adjustments, but would linearly interpolate the position to provide a more visually smooth movement curve. I made the movement speed adjustable based on the objects weight to provide a more weighty feel. These changes helped make the movement feel smoother, though clipping was still a very prominent issue that I needed to fix differently.
Player Controller Blueprints Overview

Telekinesis Focused Blueprints

The fix I decided on would include adding a new box trace. I was initially using the players forward vector with a line trace to determine what object the player wanted to grab, as well as the intended location for a grabbed object to move to. This worked well enough, but didn't properly account for obstacles blocking the object. This second box trace would be drawn from the grabbed object to the location it's intended to move to. If there is an obstacle blocking this path, the object will instead only attempt to move to that obstacle, but no further. This not only felt very smooth, but also enabled the linear interpolation to apply deceleration to the object as it approached a wall/floor, making it feel to the player even more "floaty" in a way one would expect telekinesis to feel. This solution took a lot of iteration, but the end result was very stable and noted by play-testers to be satisfying and refined feeling.
How This Project Led to Growth
As stated before, this project was my first time working in the Unreal Engine. What had not been stated, however, was that this was my first attempt at creating a 3D game from the ground up. This project provided me with invaluable experience that allowed me to approach future projects, both in and out of Unreal, as well as both 3D and 2D.
Being the primary Technical Designer on the team, as well as an important Gameplay Programmer, I also got to have a lot of ownership over the player controller, as it shaped the way the other mechanics would be interacted with. Creating this player controller was my first task in the Unreal Engine, and with the help of documentation and shared resources from teammates, I was able to get this done fairly quickly. This learning process helped me gain a lot of well needed confidence in Blueprints, as that was my first visual scripting language.
The telekinesis mechanic provided me an opportunity to apply vector algebra to a 3D game environment. The issues I encountered working with it also gave me the experience I needed to truly gain confidence in the Unreal engine. Line and box traces ended up being very useful to my future Unreal project, and Linear Interpolation is a tool I find invaluable for creating smooth and satisfying gameplay.
Lastly, the team I worked on was my first multi-disciplined game team. Working with sound and music designers/programmers, as well as level and narrative designers. This was also the largest team I had worked on, which created it's own set of challenges that overall I was more than happy to tackle. The communication required, as well as regular team meetings, gave me plenty of practice to help me develop the skills required to work effectively in larger team environments. The multi-disciplined nature of the team also allowed me the chance to work as a Technical Designer, working as the "middle-man" between the design team and the programming team. This experience proved to be very important in my later team project, as there I acted as the sole Gameplay Programmer and Technical Designer.
Overall, I'm very happy with the development of this game. I feel that the things I've learned, as well as the challenges I've overcome, have pushed me out of my comfort zone enough to be not only a capable Unreal developer, but more broadly a better Gameplay Programmer/Technical Designer as a whole.
