eRATicate

Production time: 14 weeks, 50%

Team size: 22

Engine: Catbox


Contributions:

-Animation Controller

-Animation Events

-Animation Layers

-Player animation implementation

-Weapon upgrade cutscene implementation

-Weapon material switching

-Extra particle system settings

-Prefab Linking

-Component copy & paste


Animation Controller Editor

During this project I focused on animation tools & implementation. The animators requested an animation controller editor similar to the one in Unity, so I used the node editor library handed out to us for our visual scripting course and reworked it to be usable for this purpose.

You can create states by right clicking and selecting “New Node”. You can then click on the node to select which animation it should use, and drag arrows between nodes to create transitions. Clicking on a transition brings up some settings, such as a checkbox for Exit Time, and a list of parameters that need to be true before the transition can trigger.

Animation Events

Animation events makes it very simple to sync actions with animations without having to hardcode a timed offset. We used animation events for the backpack double jump boost effect, spawning dust clouds at the player's feet when walking, and for the melee attack. Clicking on a node lets you add any amount of animation events. You can specify the frame it should trigger at as well as the event type. The currently implemented event types are spawning prefabs and playing sound effects, which was all we needed for this project.

When using the Prefab animation event, you can specify which bone the prefab should spawn at, which lets you spawn vfx at the correct position. By using the bone parenting I made during the previous project, you can also parent the spawned object to the bone so it follows the animation.

Animation Layers

Since it's possible to unlock 3 different kinds of weapons, we wanted to utilize animation layering to avoid having to create separate animations for every weapon type. Making the animation layers in the editor was simple, since each layer is just its own graph.

You can also specify which bones the layer should affect by having a dropdown menu of all the bones, and selecting one will mask that bone and all of its child bones. The weapon animations are masked to the weapon root bone, so you can switch weapons while moving around. Aiming and shooting also has its own layer which overrides the base layer, helping the graphs stay clean and readable.

Player Animation Implementations

Since our animators and programmers already had a lot on their plate, I offered to help out by implementing the player animations. I was happy to work with my own animation controller editor since it was easier to find and fix problems if I experienced them first-hand.

The player has a base layer which contains locomotion and melee combat animations. Then there is an aim mode layer which overrides the base layer if you are aiming or shooting your weapon. Finally, there is the weapon layer which overrides only the gun. It is used for weapon switching animations, and since it is layered the weapon switching animations can be played while the player is walking or jumping.

I also implemented the animations for our weapon upgrade events.

Prefab linking

Something the level designers requested was for objects to be linked to prefabs so they don’t have to keep manually replacing the objects in their scenes whenever a prefab was updated. Instead of saving the object’s component data directly in the scene file, it now saves the name of the prefab it is linked to, and it will then load in that prefab’s components. This also had the added benefit of making the scene files take up a lot less space.

Prefab-linked objects are rendered blue in the hierarchy, and if the link is broken (through either deleting or renaming the file) it will be rendered red, which makes it easy to find and re-link.

Copy & paste components

A pretty self-explanatory quality of life feature. It stores a component's data in a string format and then loads the data in another component.