Rope Joints and Reeling
Configured joints on the rope segments (exported cylinder) to make the rope physics flow properly. Coded the reeling functionality of the rope - this is the second iteration which used interpolation to be smoother, and also removed inefficient method calls.
The visuals and how they appear for the rope was not done by me. When reeling up or down, the middle/body segments use either the next or previous segment's position, and interpolate towards it. The end segments use the current direction of the rope and your current direction (up/down) to predict the next position to interpolate towards. The length of the rope and how far you can reel is determined by the minimum and maximum length, as well as the current length of the rope. The rope keeps its current speed and direction when reeling so it feels fluid.
Player Rope Aim/Shooting
From play-testing results, a decision was made to make the aiming no longer precision based, but instead give players some flexible wiggle room. I performed a spherical cast from the camera pivot to find grappable surfaces within range, then performed a second raycast from the player to the grappable surface to see if anything was in the way. We didn't want players to grapple points through walls.
Network Object Syncing
I was recommended by my professor to create my own object syncing script in order to have more control, so I did exactly that. I created a custom syncing script that allowed you to sync object transform data (position and rotation), object body velocities (including angular), and joints. It also allowed for expandable unity component syncing for members stored in them in code. You are also able to sync animations easily by using the parameter names and types as elements of a struct, that get directly inserted into a dictionary using the parameter name. This allows for expansion as well as efficiently and cleanly syncing without having to fill the script with members for interpolation.
Safety Net, Airlock, and Screen Transition
Created a safetynet script for our players when in a game. It handles sceneLoaded events, player joining and leaving, and stores the players' current scene so they can progress from where they left off if someone leaves.
Created an Airlock script that handles level loading and when to do it. Since our game is in a spaceship, it was aptly named this.
We needed to have some sort of transition animation to make the loading feel smooth. I used Unity's Animation tool to fade in/out a black screen, then created a script that let you change the fading in/out start and end times. You could artificially change the loading screen time using the editor. The script is a singleton, and can be called whenever you need to fade in/out the screen. The script also contains a delegate that can be changed, and gets called using an event from the animation timeline for when the animation ends.
Radial Wheel Emote Menu + Icon Placement
We learned early on that we needed some interaction or behavior between the players since we are a co-op game, so we created emotes. I made a radial wheel menu that is a radial wheel image using Unity's radial property, as well as the 360 angle cuts. You can change the amount of wheel items in the editor, and the menu will automatically cut itself in to the right size/pieces for the current number of items. Since the positions of the wheel pieces are technically zero, I had to come up with some calculations in order to correctly position and scale the icons to fit the wheel, no matter the resolution/screen size.
Emotes are stored as scriptable objects and contain members such as motion, speed, time etc. Some players went without ever using emotes, so you stay using a normal animator. However, if you use an emote for the first time, it will switch you to use an animation override controller, which is needed as it will override the emote state's motion and use your settings. This was implemented in this way to prevent animator clutter, as well as add for easy expansion - both player characters have their own set of emotes after all.
Modular and Recursive Gun Part System
Designed and created a gun component system that lets you attach parts to sockets that are located on other parts. Everything follows a parent-child hierarchy in script, which eventually leads to the default parts, which then lead to the main base gun (script). You can technically infinitely attach parts. Removing parts also works, and if you remove a part with attached parts, those parts will also be removed. The orientation of the parts don't matter as they are positioned to sockets, rotated, then offset using a direction and distance from the socket to an attach point. UI is used for testing purposes currently.
Manager - Entities, Components, Systems
I used a manager to update and render systems that subscribed to them using a template. If the list passed in contains the system, the system's update or render method will be called. Entities and Systems are stored in collections (vector/table), and are unique pointers. I used unique pointers as I wanted to learn how they worked, and familiarize myself with them. Entities contain a collection of components, that use templates so you can add any component to them. I use bitwise operations for when adding components and using systems, so you can efficiently check if the conditions are met for the systems to work on those entities with the required components. Entities also use a scenegraph for if you want to add children or parents.
Special Ability System
Since the game was a combat racer that we wanted to keep interesting, we needed a system that would allow for easy implementation of different special abilities. I created this system with efficiency in mind, and wanted to be able to easily create another special if we needed. We wanted to show a visual change too for the ability you chose, so I used UE4's socketing system and made it so each special has a reference that can be changed to any model, and it gets socketed to the special socket after you choose your ability.
Unfortunately we only had time to create 2 specials as we had to focus on classes a lot.
FPS Tech Demo