If you haven’t read the project post for Terminal before reading this, please do so here!
Project Goals
Returning to this project, I had pretty big indicators on what to improve. Mainly on the animation and AI front.
As a base, I initially had a COD Zombies-like experience comprised with the following components:
- Constructed Level
- Basic AI Components
- Zombie Behaviour Tree
- Basic Tasks and Services
- Basic Animation Components
- Blendspaces
- Basic Animation BP
Upon revisit, I thought it would be a fun technical challenge to deviate from a the basic COD AI and build out more interesting behaviours. As a result, I scrapped the AI and animation components, opting to re-implement them in C++ and improve them with other techniques.
Here are some nifty systems I wanted to learn coming into this project:
-
Environment Query System
Unreal’s EQS lets you query the environment for data, such as locations. I initially discovered this technique trying to implement a wall climber (that’s for another time), and thought it would be perfect for building out behaviours such as hiding and strafing due to its useful filtering and scoring systems.
-
Animation BP
Animation blueprinting was a pretty big weakness in my skills and something I wanted to understand better. As a result, I took the time to learn how the Event Graph, Anim Graph and State Machines tied together. Oh and Blendspaces.
-
Layered Animations
The initial project has pretty rigid animations. When attacking, for example, the enemy would stand still and perform the full-body animation. This set a limitation on it’s behaviour, as the lack of blending meant the running animation would stop when attacking mid-movement. I figured using layered animations would open up some possibilities in my behaviour tree development.
What Went Well
-
Assets
Having much of the asset work and decisions done previous streamlined the development a tremendous amount.
-
Learning Goals
I am much more comfortable with Animation Blueprints and more complex animation techniques such as Layered Animation. This was initially a pretty big weakness of mine, so I am pretty proud. I also learned how to knit Unreal’s EQS with behaviour trees to create some awesome behaviours.
-
Playtesting
I brought in some friends in to playtest and got some awesome feedback. One notable adjustment is that I added a tooltip to guide the player to find and pick up the gun at the start.
-
Asset File Structure
The initial folder structure for the assets was a hell-zone. I re-organised a lot of the content according to the UE5 Style Guide
What Didn’t
-
Script File Structure
I admittedly did not know you could organise CPP files into subfolders until I saw it in a video. It is embarrassing but it will be a cathartic experience organising my next projects.
-
Damage Feedback
I got feedback that the response from hitting enemies was non-existent. I added a hit sound-effect to try alleviate this, which helped but I also wanted to implement an additive damaged animation. I was unfortunately unable to do this in time. Additive animations will probably go into my bucket list for things I want to include into a project.
-
Use of
check()
andensure()
When looking through resources, I found some interesting code I wasn’t really familiar with —
check()
. It can be a an alternative to using theif()
statement to check if things are null, when!= nullptr
is assumed to be always true.