In this project, I got the opportunity to wear a variety of hats throughout our phases of development; contributing to programming, design, production, and otherwise.
Starting out as the 1st programmer on the project, and after we decided to use Unreal, I had the chance to test new practices I had learned on Remanence, my previous project in UE 5, and also the opportunity to learn a lot more about network programming, as it was my responsibility to set up a the of the fps mechanic prototypes and networked systems.
One practice I applied that I had learned earlier that year was using modules to separate C++ code, for faster compile times, and for potential smaller player updates.
Separating C++ code based on category, we ended up having 5 modules in addition to the base Charge! one, and I would highly reccomend starting projects with this practice in mind. First, it helps with good code separation, as to use another module's code, you have to explicitly include it your current module's build.cs file. Additionally, runtime C++ compile times have always been good, and while there are multiple factors that contribute, usually only the changed modules are compiled during runtime, so having multiple modules certainly helps.
And, while learning the needed networked programming princpals, which came largely down to learning Unreal RPCs (remote procedure calls) and replication, as well as confirming how we wanted to go about client server and/ or peer-to-peer connections, I came across this video. If you want to learn networked programming, I would highly, highly reccomend it.
The way I generally approach learning a new way of doing things is to learn what the the available tools/ techniques are, including the niche ones when possible, and why each should be used. Then, I go on to practicing a small example, using my knowlege of the right tools for that task. If this method sounds somewhat useful to you, then in addition learning about client-server and peer-to-peer mutliplayer models, which I'd recommend doing first, this contains, in my experience, the rest of the topics needed for getting started with multiplayer programming in Unreal. It has a base overview of supporting features like net connections, and the main features you will be actively using, which are the 3 types of RPCs, and replication. It also includes client-server use case examples at the end, which were a helpful reference for implementing server-side hit confirming.
The team expanded further during this time too, and with new teammates joining fairly frequently, and creation of art aspects like weapon models and animations gaining speed, I got opportunities to write documentation to help new members get set up, and become more familiar with Unreal art pipelines to help create ours.
In the process of documenting, and 1.5 years later, the document I've written that's saved us the most time so far has been the project setup steps.
I created this because I realized that the instructions would be repeated a lot, and also to record common problems. After a few iterations based on questions asked while using it, the last 7+ people that have used it have needed very little additional help, which is good on them too, and I have appreciated the smoothness on both ends.
For the animation pipeline, the need for different 1st person and 3rd person animations came up, as our animators wanted more control to make things look better by specializing animations for each view. To accomplish this, I combined each perspective's animation blueprints into one generic animation blueprint, and used Data Assets, organized in a Data Table, to enable different animations for each.
Beyond this was plenty of prototyping mechanics, implementing art, playtesting, and starting to add polish features as we honed in on our map design and look, core FPS movement/ weapon feel, game mode, and few unique mechanics like light-based weapon modifiers.
Some of the features like the modifiers, and bot AI that I created for this are shown on the main Charge! page if you'd like to check them out.
And, for updates to this page, I may add something about any or all of these:
The iterations of prototyping the light-based weapon modifers.
The different methods I found for retargeting character animation in Unreal, and my reccomendations for sharing animations between models in Unreal 5.3, even if your skeleton is somewhat different then the Unreal base skeleton.
Using vertex animation textures created with Unreal's AnimToTexture plugin to optimize the performance of certain animated objects, including our 200+ spinning objective nodes. (For now though, if you want a way to do vertex texture animation to make relatively non-state-related skeletal animations more performant, I'd check out this youtube tutorial, and the github repo it links https://www.youtube.com/watch?v=vrlFozqB0jA&t=1s).