Project period: 2022, for an 8 weeks period.
My role: AI/Gameplay Programmer.
My contribution:
- AI Behaviour
- Skillshot transfer mechanic
- Assisting development where I could
The game is a 2.5D shooter where you can transfer to an enemies body.
While the enemies themselves are all the same in behavior, they have a rock-paper-scissors weakness system based on their color.
As already mentioned, you can switch bodies with the enemies, leaving your own to be turned into an enemy.
This is used to pick a healthier and potentially stronger body to clear the level.
Process: I worked on all of the AI behavior for the game alongside one of our designers. My main task here was implementing the behavior based on design and communicating actively with him to make sure everything stays on track and to promote continuous iteration. Since I was learning how to use Unreal, how to use behavior trees, and how to use EQS, a lot of the work was also learning all of these systems. During development, as I mentioned before, I kept showing the progress to my designer, giving my opinion on the current behavior and getting his. From there on, I iterated and expanded on the AI.
Implementation: The main goal was to get an AI that would strafe around the player stopping and shooting bursts of projectiles while giving the player enough time to react and dodge. I managed this using EQS (Environmental Query System), which allows for taking information from the environment and using it to decide on the AI's actions. This is primarily used by our AI to decide where it should move to by doing checks like Line Of Sight, closest point at a minimum distance, etc. By using this system instead of doing things manually, we could get a lot of detailed behavior done quickly.
Process: Besides the AI, I also worked on the mechanic that allows the player to transfer bodies. The team wanted an ability to switch bodies that required some skill to perform, nothing too difficult though. It started as a straight-shooting bullet which was then changed by a designer, without communicating, to a "hold to transfer" mechanic because it was too hard to hit using a controller. After some complaints of all skill expression being removed due to these sudden changes, we turned it into a semi-homing bullet which addresses both the difficulty of hitting the target and the skill requirement of needing to aim while also unintentionally adding more interesting and overall fun scenarios since the bullet could now curve around the original target and hit another AI instead. Like with the AI behavior, I periodically asked for feedback to keep the iterative workflow going.
Implementation: The implementation of the homing bullet was relatively simple since we could use Unreal's built-in projectile system. Swapping bodies was done by unpossessing the AI controller from the actor and transferring the controls to the player. The AI stayed focused on the old body until it was repossessed by a new AI controller. Since the body is the same for both the AI and the player, they share everything from 'Ammo' to HP (AI, however, does not use the ammo since this could cause a soft lock or just unfun situations where you run out of ammo almost immediately on transfer). While AI does look for line of sight, they will shoot after moving and can, therefore, perform friendly fire. This was intentional behavior the player could abuse by transferring at the right time to kill their old body or to line AI up to shoot each other.
This project was the first time I touched Unreal, behavior trees, and EQS (Environmental Query System), but the results were quite good given the context and the time we had.
The AI behavior went well with me getting a good bit of help understanding the behavior trees and EQS from someone in our team who already had some experience with this.
The only 'negative' point would be the communication issues we had with the transfer mechanic and how to implement it, but we resolved this with a short discussion.
Overall, the project didn't really have any conflicts or particularly challenging issues that took a lot to overcome.
I learned the importance of keeping up direct communication with the team, working closely with my designers and iterating on work frequently while developing a feature.
Besides this, the project also showed the importance of communicating potential changes instead of forcing them through without mentioning it.
The transfer ability being an example of a mechanic that could have gone a lot smoother if all invlolved parties discussed the issues and the options to fix it instead of acting too quickly.